<?php
/**
 * Page index du module par défaut
 * Présente le site
 *
 * @category actions
 * @package default
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class indexAction extends shAction {

	/**
	 * Méthode d'initialisation
	 */
	public function init() {
		$this->addJavascript('javascript/saisiedescours.js');
		$this->addJavascript('javascript/planning.js');
	}

	/**
	 * Execute la méthode par défaut pour l'action index (affichage d'un formulaire et du planning)
	 * @param <string> ids des promotions (séparés par des tirets
	 * @param <> mode d'affichage du planning
	 * @param <date> date au format "URL"
	 * @param <string> ids des groupes (séparés par des tirets)
	 */
	public function execute($_promotions = null, $_mode = null, $_date = null, $_groupe = null) {
		// Crée le tableau (et le trie) des promotions
		if ( !empty($_promotions) ) {
			$_promotions = explode('-', $_promotions);
			sort($_promotions);
		}
		else {
			$_promotions = array();
		}

		// Définition du titre de la page
		$this->setTitle('Saisie des cours');
		//$this->addParametersModel('promotions','mode','date', 'groupe');

		// Gestion de l'affichage du planning en lui passant les paramètres demandés
		$planning = new Planning;
		$planning->setPromotions($_promotions)
			   ->setMode(($_mode != null) ? $_mode : Planning::SEMAINE)
			   ->setDate(($_date != null) ? Date::fromURL($_date) : Date::today())
			   ->setAdmin(true);

		// Création du formulaire
		$formulaire = new shFormulaire();

		// Création d'un champs pour la date
		$text_date = shField::DATE('Date')
			   ->setValue(Date::today()->toFormulaire())
			   ->appendTo($formulaire);

		// Met à jour le champ date en fonction du paramètre
		if($_date != null)
			$text_date->setValue(Date::fromURL($_date)->toFormulaire());

		// Ajout d'une liste à choix multiple pour les promotions
		$multibox_promotion = shField::multibox('Promotions')
			   ->appendTo($formulaire);

		// Récupère les promotions en cours pour la date sélectionnée
		$promotions = $this->executeLoadPromotions($planning->getDate()->toURL());

		$promotion_intitules = array();
		// Ajout des promotions dans la multibox
		foreach($promotions AS $promotion) {
			$annee = Date::fromSGBD($promotion->date_debut)->format('Y') .'-'. Date::fromSGBD($promotion->date_fin)->format('Y');
			$multibox_promotion->addOption($promotion->id, $promotion->specialite.' '.$promotion->filiere.' '.$annee);
		}

		// Si pas de promotion en paramètre, on prend la première qu'on trouve
		if ( (!$planning->isPromotion(0) ) AND ($promotions) AND !empty($promotions) )
			$planning->addPromotion($promotions[0]->id);

		// Sélection des champs selon le paramètre promotions
		$multibox_promotion->setValue($planning->getPromotions());
	

		// Lorsque le formulaire est soumis, on redirige vers la même page, avec des paramètres
		$formulaire->setSubmit(function($formulaire) use($planning) {
				   $promotion = implode('-', $formulaire->getField('Promotions')->getValue());
				   $date = str_replace('/', '-', $formulaire->getField('Date')->getValue());
				   shAction::redirect(shRequest::__instance()->getModule(), shRequest::__instance()->getAction(), null, array($promotion, $planning->getMode(), $date));
			   })

		;

		// Assignation du formulaire
		$this->assign('formulaire', $formulaire);
		// Assignation du formulaire
		$this->assign('promotions', implode('-', $planning->getPromotions()));
		// Assignation de la date
		$this->assign('date', $planning->getDate()->toURL());
		// Assignation du planning à la page
		$this->assign('planning', $planning);

	}

	/**
	 * Execute la méthode de création d'un cours
	 * @param <date> date de création
	 * @param <string> ids des promotions (séparés par des tirets
	 * @param <integer> id de l'ue
	 * @param <integer> id du type d'enseignement
	 */
	public function executeCreate($_date = null, $_promotions = null, $_ue = null, $_type_enseignement = null) {

		// Définition du titre de la page
		$this->setTitle('Ajout d\'un cours');

		// Permet de constituer le fil d'ariane
		$this->addAriane(shRequest::link('saisiedescours'), 'Saisie des cours');

		// Détermine le modèle des paramètres attendus
		//$this->addParametersModel('date', 'promotions', 'ue', 'type_enseignement');

		// Vérification du paramètre date, sinon par défaut à la date du jour
		$date = ($_date != null) ? Date::fromURL($_date) : Date::today();


		// Création du formulaire
		$formulaire = new shFormulaire;
		$formulaire->setSubmitText('Suivant');

		// Création d'un champs texte
		shField::string('Date')
			   ->setValue($date->toFormulaire())
			   ->appendTo($formulaire);


		// Initialisation des variables pour le submit
		$parametre_promotions = null;
		$parametre_ue = null;
		$parametre_type_enseignement = null;

		// Vérification du paramètre Promotion
		if($_promotions != null ) {
			$parametre_promotions = $_promotions;
			$promotions = explode('-', $_promotions);

			// Requêtes pour récupérer les intitulés de promotions
			$result_promotions = $this->executeLoadPromotionsFromParametre($_promotions);

			$tab_promotions = array();
			// Ajout des promotions dans la multibox
			foreach($result_promotions AS $promotion) {
				$annee = Date::fromSGBD($promotion->date_debut)->format('Y') .'-'. Date::fromSGBD($promotion->date_fin)->format('Y');
				$tab_promotions[] = $promotion->specialite.' '.$promotion->filiere.' '.$annee;
			}

			// Création d'un champs texte
			shField::string('Promotion(s)')
				   ->setValue(implode(', ', $tab_promotions))
				   ->appendTo($formulaire);

			// Test sur le paramètre UE
			if($_ue != null) {
				$parametre_ue = $_ue;
				$id_ue = $_ue;

				// Requête pour sélectionner l'intitulé de l'ue
				$result_ue = shSGBD::selectOne(
					   'SELECT ue.intitule '.
					   'FROM ue '.
					   'WHERE ue.id=:id_ue ',
					   array(':id_ue'=>$id_ue)
				);

				$intitule_ue = ($result_ue) ? $result_ue->intitule : 'Pas d\'ue correspondante trouvée';

				// Création d'un champs texte
				shField::string('Ue')
					   ->setValue($intitule_ue)
					   ->appendTo($formulaire);

				if($_type_enseignement != null) {
					$parametre_type_enseignement = $_type_enseignement;
					$id_type_enseignement = $parametre_type_enseignement;

					// Requête pour sélectionner l'intitulé de l'ue
					$result_type_enseignement = shSGBD::selectOne(
						   'SELECT type_enseignement.intitule '.
						   'FROM type_enseignement '.
						   'WHERE type_enseignement.id=:id_type_enseignement ',
						   array(':id_type_enseignement'=>$id_type_enseignement)
					);

					$intitule_type_enseignement = ($result_type_enseignement) ? $result_type_enseignement->intitule : 'Pas de type d\'enseignement correspondant trouvé';

					// Création d'un champs texte
					shField::string('Type de séance')
						   ->setValue($intitule_type_enseignement)
						   ->appendTo($formulaire);

					// Sélection
					$enseignants = $this->executeLoadEnseignantFromUe($id_ue);

					// Création de la select box de choix des ues
					$select_enseignant = shField::select('Enseignant')
						   ->addOption(null, '')
						   ->setRequired(false)
						   ->appendTo($formulaire);

					foreach($enseignants AS $enseignant)
						$select_enseignant->addOption($enseignant->id, $enseignant->prenom.' '.$enseignant->nom);

					// Modifie le nom du bouton de soumission
					$formulaire->setSubmitText('Ajouter le cours');

					$type_enseignement = $_type_enseignement;

					// Requête pour sélectionner les groupes en fonction de l'ue et de la promotion
					$groupes = $this->executeLoadGroupes($_promotions, $id_ue, $type_enseignement);


					if($groupes != null) {
						// Affiche une multibox pour les groupes
						$multibox_groupe = shField::multibox('Groupe')
							   ->setRequired(false)
							   ->appendTo($formulaire);

						foreach($groupes AS $groupe) {
							$multibox_groupe->addOption($groupe->id_groupe,
								   $groupe->intitule_filiere.' '.$groupe->intitule_specialite.' '.$groupe->intitule_groupe);
						}

					}

					// Champs texte l'heure de début
					$text_heure_debut = shField::hour('Heure début')
						   ->appendTo($formulaire);

					// Champs texte l'heure de fin
					$text_heure_fin = shField::hour('Heure fin')
						   ->appendTo($formulaire);

					// Requête pour sélectionner les salles
					$salles = $this->executeLoadSalles();

					// Selectbox pour la salle
					$select_salle = shField::SELECT('Salle')
						   ->setRequired(false)
						   ->addOption(0, 'Salle XXX')
						   ->appendTo($formulaire);

					// Ajout des salles dans la select box
					foreach($salles AS $salle)
						$select_salle->addOption($salle->id, $salle->intitule);
					/*
		    // Champs texte de la date de fin de récursivité (facultatif)
		    $text_date_debut_recursivité = shField::date('Date de début de récursivité')
			->setHelper('Créer un cours hebdomadaire depuis')
			->setRequired(false)
			->appendTo($formulaire);
					*/
					// Champs texte de la date de fin de récursivité (facultatif)
					$text_date_fin_recursivité = shField::date('Date de fin de récursivité')
						   ->setHelper('Créer un cours hebdomadaire jusqu\'au')
						   ->setRequired(false)
						   ->appendTo($formulaire);

					$f = shField::link('Précédent')
						   ->setValue(shRequest::link('saisiedescours','index','create',array($date->toURL(), $parametre_promotions, $parametre_ue)))
						   ->appendTo($formulaire);

				} // End if (parametre types_enseignement)
				else {

					// Requête pour sélectionner les types d'enseignement de l'ue
					// Liste de sélection pour le type d'enseignement
					$types_enseignement = $this->executeLoadTypeEnseignementFromUe($id_ue);

					// Liste de sélection du type d'enseignement
					$select_type_enseignement = shField::select('Type de séance')
						   ->appendTo($formulaire);

					if(!$types_enseignement)
						$select_type_enseignement->setError('Aucun type de séance trouvé pour l\'ue');

					foreach($types_enseignement AS $type_enseignement)
						$select_type_enseignement->addOption($type_enseignement->id, $type_enseignement->intitule);


					$f = shField::link('Précédent')
						   ->setValue(shRequest::link('saisiedescours','index','create',array($date->toURL(), $parametre_promotions)))
						   ->appendTo($formulaire);
				}
			}
			else {

				// Sélection
				$ues = $this->executeLoadUesFromPromotions($_promotions);


				// Création de la select box de choix des ues
				$select_ue = shField::select('UE')
					   ->appendTo($formulaire);

				// Test s'il y a au moins une ue
				if($ues == null)
					$select_ue->setError('Aucune ue trouvée pour la (les) promotion(s) sélectionnée(s)');

				// Ajoute les ues dans la select box
				foreach($ues AS $ue)
					$select_ue->addOption($ue->id, $ue->intitule);

				shField::link('Précédent')
					   ->setValue(shRequest::link('saisiedescours','index',null,array($parametre_promotions, Planning::SEMAINE, $date->toURL())))
					   ->appendTo($formulaire);
			}

		} // End if paramètre promotions
		else {
			throw new Exception('Paramètre promotions requis', 404);
		}

		// Check du formulaire
		$formulaire->setCheck(function($formulaire) use ($date, $parametre_promotions, $parametre_ue, $parametre_type_enseignement) {

				   // Test sur les champs heure de début et heure de fin de cours
				   if( ($formulaire->isField('Heure début')) AND ($formulaire->isField('Heure fin'))
						 AND ($formulaire->getField('Heure début')->getValue() != '')
						 AND ($formulaire->getField('Heure fin')->getValue() != '') ) {

					   $heure_debut = explode(':', $formulaire->getField('Heure début')->getValue());
					   $heure_fin = explode(':', $formulaire->getField('Heure fin')->getValue());

					   if($heure_debut[0] < 8)
						   $formulaire->getField('Heure début')->setError('L\'heure de fin ne peut pas être inférieur à 8:00');
					   if($heure_fin[0] > 20)
						   $formulaire->getField('Heure fin')->setError('L\'heure de fin ne peut pas être supérieur à 20:00');

					   if($heure_debut[0] > $heure_fin[0])
						   $formulaire->getField('Heure début')->setError('L\'heure de début doit être inférieure à l\'heure de fin');
					   elseif( ($heure_debut[0] == $heure_fin[0] ) AND ($heure_debut[1] > $heure_fin[1]) )
						   $formulaire->getField('Heure début')->setError('L\'heure de début doit être inférieure à l\'heure de fin');

				   }

				   // Test si le jour n'est pas désactivé
				   if($date) {


				   }

			   })
		;

		// Submit du formulaire
		$formulaire->setSubmit(function($formulaire) use ($date, $parametre_promotions, $parametre_ue, $parametre_type_enseignement) {




				   if($formulaire->isField('Heure début')) {
					   $tab_promotions = explode('-', $parametre_promotions);

					   // Sélection de l'enseignement en fonction de l'ue et du type d'enseignement
					   $enseignement = shSGBD::selectOne(
							 'SELECT enseignement.id '.
							 'FROM enseignement '.
							 'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
							 'WHERE enseignement.id_ue=:id_ue '.
							 'AND type_enseignement.id=:id_type_enseignement ',
							 array(':id_ue'=>$parametre_ue,
							 ':id_type_enseignement'=>$parametre_type_enseignement)
					   );

					   // Vérifie que l'enseignant ne soit pas vide, sinon = null
					   $id_enseignant = ($formulaire->getField('Enseignant')->getValue() > 0) ?
							 $formulaire->getField('Enseignant')->getValue()
							 : null;

					   // Vérifie que la salle ne soit pas vide, sinon = null
					   $id_salle = ($formulaire->getField('Salle')->getValue() > 0) ?
							 $formulaire->getField('Salle')->getValue()
							 : null;

					   // Préparation des valeurs pour l'insert de la séance
					   $values = array(
							 ':id_enseignement'=>$enseignement->id,
							 ':id_salle'=>$id_salle,
							 ':id_enseignant'=>$id_enseignant,
							 ':id_parent'=>null,
							 ':jour'=>$date->toSGBD(),
							 ':heure_debut'=>$formulaire->getField('Heure début')->getValue(),
							 ':heure_fin'=>$formulaire->getField('Heure fin')->getValue()
					   );

					   // Par défaut la récursivité est à faux
					   $recursivite = false;
					   $date_fin = $values[':jour'];

					   // Test si une récursivité est demandée
					   if($formulaire->getField('Date de fin de récursivité')->getValue() != '') {
						   $recursivite = true;
						   $date_fin = Date::fromFormulaire($formulaire->getField('Date de fin de récursivité')->getValue())->toSGBD();


						   // Requête pour vérifier que les dates de fin de promotions ne sont pas inférieurs à la date de fin de récursivité
						   $result = shSGBD::selectOne(
								 'SELECT promotion.date_fin '.
								 'FROM promotion '.
								 'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($tab_promotions) - 1).') '.
								 'ORDER BY promotion.date_fin ',
								 $tab_promotions);

						   if($result->date_fin < $date_fin)
							   $date_fin = $result->date_fin;

						   // Test si la date de fin n'est pas antérieure à la date de la séance
						   if($date_fin < $date->toSGBD())
							   $date_fin = $date->toSGBD(); // Afin de limiter les boucles inutiles

					   }

					   $parent = true;

					   do {
						   // AJOUTER NOTION DE JOUR DESACTIVE


						   // Création de la séance
						   $id_seance = shSGBD::insert(
								 'INSERT INTO seance '.
								 '(id_enseignement, id_salle, id_enseignant, id_parent, jour, heure_debut, heure_fin) '.
								 'VALUES (:id_enseignement, :id_salle, :id_enseignant, :id_parent, :jour, :heure_debut, :heure_fin) ',
								 $values);

						   if($parent) {
							   $parent = false;
							   $values[':id_parent'] = $id_seance;
						   }

						   // Insertion dans la table mutualiser pour indiquer les promotions qui vont assister à la séance
						   foreach($tab_promotions AS $promotion) {

							   shSGBD::insert(
									 'INSERT INTO mutualiser '.
									 '(id_promotion, id_seance) '.
									 'VALUES (:id_promotion, :id_seance) ',
									 array(':id_promotion'=>$promotion, ':id_seance'=>$id_seance)
							   );
						   }


						   // Si le champ groupe existe
						   if($formulaire->isField('Groupe')) {
							   // Récupère les valeurs de groupe sélectionnées
							   $groupes = $formulaire->getField('Groupe')->getValue();
							   // Pour chacun insertion dans la table participer pour connaître les groupes qui assistent à la séance
							   foreach($groupes AS $groupe) {
								   if($groupe != 0)
									   shSGBD::insert(
											 'INSERT INTO participer '.
											 '(id_groupe, id_seance) '.
											 'VALUES (:id_groupe, :id_seance) ',
											 array(':id_groupe'=>$groupe, ':id_seance'=>$id_seance)
									   );
							   }
						   }


						   // Modifie la date à la semaine suivante
						   $date = new Date($values[':jour']);
						   $values[':jour'] = $date->alter('+1 week')->toSGBD();


					   } while ( ($recursivite) AND
							 ($values[':jour'] < $date_fin) );

					   // Redirection vers la page de planning à la semaine centré sur la date de création du cours
					   $parametres = array(
							 $parametre_promotions,
							 Planning::SEMAINE,
							 $date->toURL()
					   );
					   shAction::redirect(shRequest::__instance()->getModule(), shRequest::__instance()->getAction(), null, $parametres);

				   }
				   else {

					   $parametres = array($date->toURL(), $parametre_promotions);
					   if($parametre_ue != null)
						   $parametres[] = $parametre_ue;
					   else if( ($formulaire->isField('UE')) AND ($formulaire->getField('UE')->getValue() != null) )
						   $parametres[] = $formulaire->getField('UE')->getValue();

					   if($parametre_type_enseignement != null)
						   $parametres[] = $parametre_type_enseignement;
					   else if( ($formulaire->isField('Type de séance')) AND ($formulaire->getField('Type de séance')->getValue() != null) )
						   $parametres[] = $formulaire->getField('Type de séance')->getValue();

					   shAction::redirect(shRequest::__instance()->getModule(), shRequest::__instance()->getAction(), shRequest::__instance()->getRequest(), $parametres);

				   }
			   })
		;


		// Assignation du formulaire à la page
		$this->assign('formulaire', $formulaire);

	}




	/**
	 * Execute la méthode d'édition d'un cours
	 * @param <integer> id de la séance à modifier
	 * @param <string> ids des promotions (séparés par des tirets )
	 * @param <integer> id de l'ue
	 * @param <integer> id du type d'enseignement
	 */
	public function executeEdit($_id_cours = null, $_promotions = null, $_ue = null, $_type_enseignement = null) {

		// Définition du titre de la page
		$this->setTitle('Modification d\'un cours');

		// Permet de constituer le fil d'ariane
		$this->addAriane(shRequest::link('saisiedescours'), 'Saisie des cours');

		// Détermine le modèle des paramètres attendus
		//$this->addParametersModel('id_cours', 'promotions', 'ue', 'type_enseignement');

		if($_id_cours != null) {
			// Création du formulaire
			$formulaire = new shFormulaire;

			// Modifie le nom du bouton de soumission
			$formulaire->setSubmitText('Suivant');

			// Récupération du paramètre id cours
			$id_cours = $_id_cours;
			$parametre_id_cours = $_id_cours;

			// Initialisation des parametres
			$parametre_promotions = null;
			$parametre_ue = null;
			$parametre_type_enseignement = null;

			// Requête pour sélectionner le cours et ses informations
			$seance = shSGBD::selectOne(
				   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
				   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
				   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
				   'type_enseignement.id AS id_type_enseignement '.
				   'FROM seance '.
				   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
				   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
				   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
				   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
				   'WHERE seance.id=:id_seance ',
				   array(':id_seance'=>$id_cours)
			);

			if(!$seance)
				throw new Exception('Numéro de séance introuvable', 404);

			// Sélection des promotions qui sont inscrits pour la séance
			$promotions = shSGBD::select(
				   'SELECT DISTINCT promotion.id AS id_promotion, specialite.intitule AS intitule_specialite, '.
				   'filiere.intitule AS intitule_filiere, '.
				   'user.id AS id_user '.
				   'FROM promotion '.
				   'INNER JOIN specialite ON specialite.id=promotion.id_specialite '.
				   'INNER JOIN filiere ON filiere.id=specialite.id_filiere '.
				   'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
				   'INNER JOIN user ON user.id=responsable.id_user '.
				   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
				   'WHERE mutualiser.id_seance=:id_seance ',
				   array(':id_seance'=>$seance->id_seance)
			);


			if(!$promotions)
				throw new Exception('Aucune promotion n\'est inscrite pour la séance. Pensez à supprimer la séance.', 404);

			$responsable = false;

			// Création d'un tableau temporaire
			$tab_temporaire = array();

			// Vérification que l'user connecté est responsable d'au moins une promotion inscrite à la séance
			foreach($promotions AS $promotion) {
				if($promotion->id_user == shSession::__instance()->getId()) {
					$responsable = true;
				}
				$id_promotions[] = $promotion->id_promotion;
			}

			// Si l'user n'est responsable d'aucune promotion, erreur
			if(!$responsable)
				throw new Exception('Vous n\'êtes responsable d\'aucune des promotions inscrites à la séance.', 404);


			// Ajout de l'id user au tableau temporaire
			$tab_temporaire = $id_promotions;
			$tab_temporaire[] = shSession::__instance()->getId();

			// Requêtes pour récupérer les intitulés de promotions
			$result_promotions = shSGBD::select(
				   'SELECT DISTINCT promotion.id, specialite.intitule AS specialite, filiere.intitule AS filiere, promotion.date_debut, promotion.date_fin '.
				   'FROM promotion '.
				   'INNER JOIN specialite ON promotion.id_specialite=specialite.id '.
				   'INNER JOIN filiere ON specialite.id_filiere=filiere.id '.
				   'INNER JOIN responsable ON promotion.id=responsable.id_promotion '.
				   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($promotions) - 1).') '.
				   'OR responsable.id_user=? '.
				   'ORDER BY filiere.intitule, specialite.intitule ',
				   $tab_temporaire
			);



			// Si il existe déjà une valeur dans le champs (cela signifie qu'il y a eu soumission du formulaire)
			if($_promotions) {

				// Mise à jour du paramètre
				$parametre_promotions = $_promotions;

				// On récupère les valeurs
				$promotions = explode('-', $_promotions);

				// Requêtes pour récupérer les intitulés de promotions
				$result_promotions = shSGBD::select(
					   'SELECT DISTINCT promotion.id, specialite.intitule AS specialite, filiere.intitule AS filiere, promotion.date_debut, promotion.date_fin '.
					   'FROM promotion '.
					   'INNER JOIN specialite ON promotion.id_specialite=specialite.id '.
					   'INNER JOIN filiere ON specialite.id_filiere=filiere.id '.
					   'INNER JOIN responsable ON promotion.id=responsable.id_promotion '.
					   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($promotions) - 1).') '.
					   'ORDER BY filiere.intitule, specialite.intitule ',
					   $promotions
				);

				$tab_promotions = array();
				// Ajout des promotions dans la multibox
				foreach($result_promotions AS $promotion) {
					$annee = Date::fromSGBD($promotion->date_debut)->format('Y') .'-'. Date::fromSGBD($promotion->date_fin)->format('Y');
					$tab_promotions[] = $promotion->specialite.' '.$promotion->filiere.' '.$annee;
				}

				// Création d'un champs texte
				shField::string('Promotion(s)')
					   ->setValue(implode(', ', $tab_promotions))
					   ->appendTo($formulaire);

				// Test si le paramètre ue existe
				if($_ue) {
					$parametre_ue = $_ue;
					$id_ue = $_ue;

					// Requête pour sélectionner l'intitulé de l'ue
					$result_ue = shSGBD::selectOne(
						   'SELECT ue.intitule '.
						   'FROM ue '.
						   'INNER JOIN enseignement ON enseignement.id_ue=ue.id '.
						   'WHERE ue.id=:id_ue ',
						   array(':id_ue'=>$id_ue)
					);

					$intitule_ue = ($result_ue) ? $result_ue->intitule : 'Pas d\'ue correspondante trouvée';

					// Création d'un champs texte
					shField::string('Ue')
						   ->setValue($intitule_ue)
						   ->appendTo($formulaire);


					// Test du paramètre type enseignement
					if($_type_enseignement) {

						// Modifie le nom du bouton de soumission
						$formulaire->setSubmitText('Modifier le cours');

						$parametre_type_enseignement = $_type_enseignement;
						$id_type_enseignement = $_type_enseignement;

						// Requête pour sélectionner l'intitulé de l'ue
						$result_type_enseignement = shSGBD::selectOne(
							   'SELECT type_enseignement.intitule '.
							   'FROM type_enseignement '.
							   'WHERE type_enseignement.id=:id_type_enseignement ',
							   array(':id_type_enseignement'=>$id_type_enseignement)
						);

						$intitule_type_enseignement = ($result_type_enseignement) ? $result_type_enseignement->intitule : 'Pas de type d\'enseignement correspondant trouvé';

						// Création d'un champs texte
						shField::string('Type de séance')
							   ->setValue($intitule_type_enseignement)
							   ->appendTo($formulaire);

						// Création d'un champs texte
						shField::date('Date')
							   ->setValue(Date::fromSGBD($seance->jour)->toFormulaire())
							   ->appendTo($formulaire);

						// Sélection
						$enseignants = shSGBD::select(
							   'SELECT enseignant.id, enseignant.nom, enseignant.prenom '.
							   'FROM enseignant '.
							   'INNER JOIN enseigner ON enseignant.id=enseigner.id_enseignant '.
							   'WHERE enseigner.id_ue=:id_ue',
							   array(':id_ue'=>$id_ue)
						);


						// Création de la select box de choix des ues
						$select_enseignant = shField::select('Enseignant')
							   ->addOption(0, '')
							   ->setRequired(false)
							   ->appendTo($formulaire);

						// booléen pour vérifier que l'enseignant correspond toujours à l'ue
						$enseignant_correspondant = false;

						foreach($enseignants AS $enseignant) {
							$select_enseignant->addOption($enseignant->id, $enseignant->prenom.' '.$enseignant->nom);
							if($enseignant->id == $seance->id_enseignant) {
								$enseignant_correspondant = true;
								$select_enseignant->setValue($enseignant->id);
							}
						}

						if(!$enseignant_correspondant)
							$select_enseignant
								   ->setHelper('<strong>L\'enseignant ne correspond plus à l\'ue sélectionnée</strong>');


						$type_enseignement = $_type_enseignement;

						// Création d'un tableau pour les paramètres de la requête des groupes
						$param_requete = $promotions;
						$param_requete[] = $type_enseignement;

						// Requête pour sélectionner les groupes en fonction de l'ue et de la promotion
						$groupes = shSGBD::select(
							   'SELECT groupe.id AS id_groupe, groupe.intitule AS intitule_groupe, '.
							   'filiere.intitule AS intitule_filiere, '.
							   'specialite.intitule AS intitule_specialite '.
							   'FROM groupe '.
							   'INNER JOIN enseignement ON enseignement.id=groupe.id_enseignement '.
							   'INNER JOIN promotion ON promotion.id=groupe.id_promotion '.
							   'INNER JOIN specialite ON specialite.id=promotion.id_specialite '.
							   'INNER JOIN filiere ON filiere.id=specialite.id_filiere '.
							   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
							   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($promotions) - 1).') '.
							   'AND enseignement.id_type_enseignement=? ',
							   $param_requete
						);

						if($groupes != null) {
							// Liste de sélection pour le groupe
							$multi_groupes = shField::multibox('Groupe')
								   ->setRequired(false)
								   ->appendTo($formulaire);

							// Sélectionne les groupes de la séance
							$groupes_seance = shSGBD::select(
								   'SELECT groupe.id '.
								   'FROM groupe '.
								   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
								   'WHERE participer.id_seance=:id_seance ',
								   array(':id_seance'=>$id_cours)
							);

							// Booléen pour vérifier que le groupe correspond à l'ue et au type d'enseignement
							$groupes_correspondants = 0;

							// Tableau pour assignement à la multibox
							$selected_groupes = array();

							foreach($groupes AS $groupe) {
								$multi_groupes->addOption($groupe->id_groupe,
									   $groupe->intitule_filiere.' '.$groupe->intitule_specialite.' '.$groupe->intitule_groupe);
								foreach($groupes_seance AS $groupe_seance)
									if($groupe->id_groupe == $groupe_seance->id) {
										$groupes_correspondants += 1;
										$selected_groupes[] = $groupe->id_groupe;
									}
							}

							$multi_groupes->setValue($selected_groupes);
							if($groupes_correspondants != sizeof($groupes_seance))
								$multi_groupes
									   ->setHelper('<strong>Un ou plusieurs groupes ne correspondent plus aux promotions et au type de séance sélectionnés</strong>');

						}
						
						// Champs texte l'heure de début
						$text_heure_debut = shField::hour('Heure début')
							   ->setValue($seance->heure_debut)
							   ->appendTo($formulaire);

						// Champs texte l'heure de fin
						$text_heure_fin = shField::hour('Heure fin')
							   ->setValue($seance->heure_fin)
							   ->appendTo($formulaire);

						// Requête pour sélectionner les salles
						$salles = shSGBD::select(
							   'SELECT salle.id, salle.intitule '.
							   'FROM salle '.
							   'INNER JOIN batiment ON salle.id_batiment=batiment.id '.
							   'ORDER BY batiment.intitule, salle.intitule',
							   array()
						);

						// Selectbox pour la salle
						$select_salle = shField::select('Salle')
							   ->addOption(0, '')
							   ->setRequired(false)
							   ->appendTo($formulaire);

						// Ajout des salles dans la select box
						foreach($salles AS $salle) {
							$select_salle->addOption($salle->id, $salle->intitule);
							if($salle->id == $seance->id_salle)
								$select_salle->setValue($salle->id);
						}
						/*
			// Champs texte de la date de fin de récursivité (facultatif)
			$text_date_debut_recursivité = shField::DATE('Date de début de récursivité')
			    ->setHelper('Créer un cours hebdomadaire depuis')
			    ->setRequired(false)
			    ->appendTo($formulaire);
						*/

						// Sélection des cours filles
						$id_parent = ($seance->id_parent != null) ? $seance->id_parent : $seance->id_seance;

						// Calcul du nombre de séances filles
						$count_seances_filles = shSGBD::count(
							   'SELECT count(seance.id) '.
							   'FROM seance '.
							   'WHERE seance.id_parent=:id_parent ',
							   array(':id_parent'=>$id_parent)
						);

						if($count_seances_filles > 0) {
							// Selectbox permettant de choisir l'option de récursivité
							$select_recursivite = shField::select('Recursivité')
								   ->addOption(1, 'Mettre à jour la séance courante uniquement')
								   ->addOption(2, 'Mettre à jour toutes les séances filles ')
								   ->addOption(3, 'Mettre à jour les séances filles identiques ')
								   ->addOption(4, 'Réinitialiser toutes les séances filles ')
								   ->appendTo($formulaire);


							// Champs texte de la date de fin de récursivité (facultatif)
							$text_date_fin_recursivité = shField::date('Date de fin de récursivité')
								   ->setHelper('Appliquer les modifications jusqu\'au (par défaut toutes les séances ultérieures)')
								   ->setRequired(false)
								   ->appendTo($formulaire);

						}

						shField::link('Précédent')
							   ->setValue(shRequest::link('saisiedescours','index','edit',array($parametre_id_cours, $parametre_promotions, $parametre_ue)))
							   ->appendTo($formulaire);

					} // End if (parametre types_enseignement)
					else {

						// Requête pour sélectionner les types d'enseignement de l'ue
						// Liste de sélection pour le type d'enseignement
						$types_enseignement = shSGBD::select(
							   'SELECT type_enseignement.id, type_enseignement.intitule '.
							   'FROM type_enseignement '.
							   'INNER JOIN enseignement ON enseignement.id_type_enseignement=type_enseignement.id '.
							   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
							   'WHERE ue.id=:id_ue',
							   array(':id_ue'=>$id_ue)
						);

						// Liste de sélection du type d'enseignement
						$select_type_enseignement = shField::select('Type de séance')
							   ->appendTo($formulaire);

						if(!$types_enseignement)
							$select_type_enseignement->setError('Aucun type de séance trouvé pour l\'ue');

						// Initialisation d'un booléen indiquant si le type d'enseignement de la séance ne correspond plus à l'ue
						$type_enseignement_correspondant = false;

						// Parcours des types d'enseignement pour les ajouter dans la select box
						foreach($types_enseignement AS $type_enseignement) {
							$select_type_enseignement->addOption($type_enseignement->id, $type_enseignement->intitule);
							if($type_enseignement->id == $seance->id_type_enseignement) {
								$type_enseignement_correspondant = true;
								$select_type_enseignement->setValue($type_enseignement->id);
							}
						}

						// Affichage d'une erreur si le type d'enseignement ne correspond plus à l'ue sélectionnée
						if(!$type_enseignement_correspondant)
							$select_type_enseignement
								   ->setHelper('<strong>Le type de séance ne correspond plus à l\'ue sélectionnée</strong>');

						shField::link('Précédent')
							   ->setValue(shRequest::link('saisiedescours','index','edit',array($parametre_id_cours, $parametre_promotions)))
							   ->appendTo($formulaire);
					} // Fin du else (parametre type enseignement)


				} // Fin du if (parametre ue)
				else {
					// Sélection des ues en fonction des promotions
					$query = 'SELECT ue.id, ue.intitule ';
					for($i=0;$i<sizeof($promotions);$i++) {
						$query .= 'FROM ue '.
							   'INNER JOIN assister ON ue.id=assister.id_ue '.
							   'WHERE assister.id_promotion = ? ';
						if($i < sizeof($promotions) - 1) {
							$query .= ' AND ue.id IN ( SELECT ue.id ';

						}
					}

					$query = $query.str_repeat(')', sizeof($promotions) - 1);

					// Sélection
					$ues = shSGBD::select($query, $promotions);


					// Création de la select box de choix des ues
					$select_ue = shField::select('UE')
						   ->appendTo($formulaire);

					// Test s'il y a au moins une ue
					if($ues == null)
						$select_ue->setError('Aucune ue trouvée pour la (les) promotion(s) sélectionnée(s)');

					// Initialisation de la variable indiquant si l'ue de la séance existe toujours pour les promotions
					$ue_correspondante = false;

					// Ajoute les ues dans la select box
					foreach($ues AS $ue) {
						$select_ue->addOption($ue->id, $ue->intitule);
						// Si l'ue de la séance est trouvée, on la sélectionne et on annule l'erreur
						if($ue->id == $seance->id_ue) {
							$ue_correspondante = true;
							$select_ue->setValue($ue->id);
						}
					}

					// Ajout d'un message d'erreur si l'ue n'est plus disponible pour les promotions sélectionnées
					if(!$ue_correspondante)
						$select_ue
							   ->setHelper('<strong>L\'ue de la séance n\'est pas disponible pour la (les) promotion(s) sélectionnée(s)</strong>');



					shField::link('Précédent')
						   ->setValue(shRequest::link('saisiedescours','index','edit',array($parametre_id_cours)))
						   ->appendTo($formulaire);

				} // Fin else (parametre ue)

			} // Fin si (parametre promotions)
			else {
				// Création d'un champs texte
				$field_promotions = shField::multibox('Promotion(s)')
					   ->appendTo($formulaire);

				$field_promotions->setValue($id_promotions);

				// Ajout des promotions dans la multibox
				foreach($result_promotions AS $promotion) {
					$annee = Date::fromSGBD($promotion->date_debut)->format('Y') .'-'. Date::fromSGBD($promotion->date_fin)->format('Y');
					$field_promotions->addOption($promotion->id, $promotion->specialite.' '.$promotion->filiere.' '.$annee);
				}

			} // Fin else parametre promotions


			// Submit du formulaire
			$formulaire->setSubmit(function($formulaire) use ($parametre_id_cours, $parametre_promotions, $parametre_ue, $parametre_type_enseignement) {

					   // Si le champ existe et qu'il n'y a pas d'erreur, on peut effectuer la mise à jour
					   if($formulaire->isField('Heure début')) {

						   // Test si le champ recursivité existe (donc s'il y a des séances filles)
						   if($formulaire->isField('Récursivité')) {


							   switch($formulaire->getField('Récursivité')->getValue()) {
								   case 1:
									   indexAction::executeEditSeance($parametre_id_cours,
											 $parametre_promotions,
											 $parametre_ue,
											 $parametre_type_enseignement,
											 $formulaire);
									   break;
								   case 2:
									   indexAction::executeEditRecursivite($parametre_id_cours,
											 $parametre_promotions,
											 $parametre_ue,
											 $parametre_type_enseignement,
											 $formulaire);
									   break;
								   case 3:
									   indexAction::executeEditRecursiviteIdentique($parametre_id_cours,
											 $parametre_promotions,
											 $parametre_ue,
											 $parametre_type_enseignement,
											 $formulaire);
									   break;
								   case 4:
									   indexAction::executeEditReinitialise($parametre_id_cours,
											 $parametre_promotions,
											 $parametre_ue,
											 $parametre_type_enseignement,
											 $formulaire);
									   break;
								   default:
									   break;
							   }
						   }
						   else { // Sinon on met à jour uniquement la séance en cours
							   indexAction::executeEditSeance($parametre_id_cours,
									 $parametre_promotions,
									 $parametre_ue,
									 $parametre_type_enseignement,
									 $formulaire);

						   }
						   /*
		// Récupération de l'id de la séance et de la date de la séance
		$id_cours = $parametre_id_cours;
		$date = Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD();

		// Requête pour sélectionner le cours et ses informations
		$seance = shSGBD::selectOne(
			'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			'enseignement.id AS id_enseignement, '.
			'type_enseignement.id AS id_type_enseignement '.
			'FROM seance '.
			'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			'WHERE seance.id=:id_seance ',
			array(':id_seance'=>$id_cours)
		);

		// Création d'un tableau des ids de promotions
		$tab_promotions = explode('-', $parametre_promotions);

		// Sélection de l'enseignement en fonction de l'ue et du type d'enseignement
		$enseignement = shSGBD::selectOne(
			'SELECT enseignement.id '.
			'FROM enseignement '.
			'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			'WHERE enseignement.id_ue=:id_ue '.
			'AND type_enseignement.id=:id_type_enseignement ',
			array(':id_ue'=>$parametre_ue,
			    ':id_type_enseignement'=>$parametre_type_enseignement)
		);


		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_enseignant = ($formulaire->getField('Enseignant')->getValue() > 0) ?
			$formulaire->getField('Enseignant')->getValue()
			: null;

		// Condition de récursivité
		$recursivite = false;
		if( ($formulaire->isField('Pas de récursivité')) AND (!$formulaire->getField('Pas de récursivité')->getValue()) ) {
		    $recursivite = true;

		    // Requête pour vérifier que les dates de fin de promotions ne sont pas inférieurs à la date de fin de récursivité
		    $result = shSGBD::selectOne(
			    'SELECT promotion.date_fin '.
			    'FROM promotion '.
			    'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($tab_promotions) - 1).') '.
			    'ORDER BY promotion.date_fin ',
			    $tab_promotions);

		    $date_fin = $result->date_fin;

		    if ( ($formulaire->getField('Date de fin de récursivité')->getValue() != '')
			    AND ($formulaire->getField('Date de fin de récursivité')->getValue() < $date_fin) )
			$date_fin =Date::fromFormulaire($formulaire->getField('Date de fin de récursivité')->getValue())->toSGBD();

		    // Sélection de l'id parent
		    $id_parent = ($seance->id_parent == null) ? $seance->id_seance : $seance->id_parent;

		    // Sélection des séances filles
		    $request_seances = shSGBD::select(
			    'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			    'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			    'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			    'enseignement.id AS id_enseignement, '.
			    'type_enseignement.id AS id_type_enseignement '.
			    'FROM seance '.
			    'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			    'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			    'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			    'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			    'WHERE seance.jour<:date_fin '.
			    'AND seance.jour>=:jour '.
			    'AND (seance.id_parent=:id_parent '.
			    'OR seance.id=:id_seance) ',
			    array(':id_parent'=>$id_parent,
				':date_fin'=>$date_fin,
				':jour'=>$seance->jour,
				':id_seance'=>$seance->id_seance)
		    );

		}
		else {
		    $request_seances = array($seance);
		}

		// Préparation des valeurs pour l'insert de la séance
		$values = array(
		    ':id_seance'=>$id_cours,
		    ':id_enseignement'=>$enseignement->id,
		    ':id_salle'=>$formulaire->getField('Salle')->getValue(),
		    ':id_enseignant'=>$id_enseignant,
		    ':jour'=>$date,
		    ':heure_debut'=>$formulaire->getField('Heure début')->getValue(),
		    ':heure_fin'=>$formulaire->getField('Heure fin')->getValue()
		);

		// Retourne la différence absolue entre la date de la séance et la date saisie dans le formulaire
		$difference_date = Date::fromSGBD($seance->jour)->diff(Date::fromSGBD($date));

		// Test si l'écrasement a été demandé
		if( (!$formulaire->isField('Ecrasement')) OR ($formulaire->getField('Ecrasement')->getValue()) ) {
		    // récupère le numéro du jour de la semaine (au format anglais 0 -> dimanche)
		    $jour_semaine = Date::fromFormulaire($formulaire->getField('Date')->getValue())->format('w');


		    foreach($request_seances AS $request_seance) {
			$values[':id_seance'] = $request_seance->id_seance;

			// Actualise la date (sur le même jour de la semaine que la séance modifiée)
			$values[':jour'] = Date::fromSGBD($request_seance->jour)->jourDeLaSemaine($jour_semaine, true);
			$values[':jour'] = $values[':jour']->toSGBD();

			// Mise à jour de la séance
			shSGBD::update(
				'UPDATE seance '.
				'SET seance.id_enseignement=:id_enseignement, '.
				'seance.id_salle=:id_salle, '.
				'seance.id_enseignant=:id_enseignant, '.
				'seance.jour=:jour, '.
				'seance.heure_debut=:heure_debut, '.
				'seance.heure_fin=:heure_fin '.
				'WHERE seance.id=:id_seance',
				$values
			);


			// Mise à jour des promotions
			// sélection des promotions
			$requete_promotions = shSGBD::select(
				'SELECT DISTINCT promotion.id AS id_promotion '.
				'FROM promotion '.
				'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
				'WHERE mutualiser.id_seance=:id_seance ',
				array(':id_seance'=>$values[':id_seance'])
			);

			// Création du tableau des anciennes promotions
			$anciennes_promotions = array();
			foreach($requete_promotions AS $promotion)
			    $anciennes_promotions[] = $promotion->id_promotion;

			// Récupération des nouvelles promotions
			$nouvelles_promotions = $tab_promotions;

			// Intersection des nouvelles et anciennes promotions
			$intersection_promotions = array_intersect($anciennes_promotions, $nouvelles_promotions);

			// Nouvelles promotions sans l'es anciennes l'intersection
			$nouvelles_promotions = array_diff($nouvelles_promotions, $intersection_promotions);

			// Anciennes promotions sans l'intersection
			$anciennes_promotions = array_diff($anciennes_promotions, $intersection_promotions);

			// Insertion des nouvelles promotions
			foreach($nouvelles_promotions AS $nouvelle_promotion) {
				shSGBD::insert(
					'INSERT INTO mutualiser '.
					'(id_promotion, id_seance) '.
					'VALUES (:id_promotion, :id_seance) ',
					array(':id_promotion'=>$nouvelle_promotion, ':id_seance'=>$values[':id_seance'])
				);
			}

			// Suppression des anciennes promotions
			foreach($anciennes_promotions AS $ancienne_promotion) {
				shSGBD::insert(
					'DELETE FROM mutualiser '.
					'WHERE mutualiser.id_promotion=:id_promotion '.
					'AND mutualiser.id_seance=:id_seance ',
					array(':id_promotion'=>$ancienne_promotion, ':id_seance'=>$values[':id_seance'])
				);
			}



			// Mise à jour des groupes (Table participer)

			// Sélection des groupes
			$request_groupes = shSGBD::select(
				'SELECT DISTINCT groupe.id '.
				'FROM groupe '.
				'INNER JOIN participer ON participer.id_groupe=groupe.id '.
				'WHERE participer.id_seance=:id_seance ',
				array(':id_seance'=>$values[':id_seance'])
			);

			// Création du tableau des anciens groupes
			$anciens_groupes = array();
			foreach($request_groupes AS $groupe)
			    $anciens_groupes[] = $groupe->id;

			// Récupération des nouveaux groupes
			$nouveaux_groupes = array();
			if($formulaire->isField('Groupe'))
			    $nouveaux_groupes = $formulaire->getField('Groupe')->getValue();

			// Intersection des nouvelles et anciennes promotions
			$intersection_groupes = array_intersect($anciens_groupes, $nouveaux_groupes);

			// Nouvelles promotions sans l'es anciennes l'intersection
			$nouveaux_groupes = array_diff($nouveaux_groupes, $intersection_groupes);

			// Anciennes promotions sans l'intersection
			$anciens_groupes = array_diff($anciens_groupes, $intersection_groupes);


			// Insertion des nouvelles promotions
			foreach($nouveaux_groupes AS $nouveau_groupe) {
				shSGBD::insert(
					'INSERT INTO participer '.
					'(id_groupe, id_seance) '.
					'VALUES (:id_groupe, :id_seance) ',
					array(':id_groupe'=>$nouveau_groupe, ':id_seance'=>$values[':id_seance'])
				);
			}

			// Suppression des anciennes promotions
			foreach($anciens_groupes AS $ancien_groupe) {
				shSGBD::insert(
					'DELETE FROM participer '.
					'WHERE participer.id_groupe=:id_groupe '.
					'AND participer.id_seance=:id_seance ',
					array(':id_groupe'=>$ancien_groupe, ':id_seance'=>$values[':id_seance'])
				);
			}

		    } // Fin foreach request_seances
		} // Fin test écrasement
		else {
		   // print_r($request_seances);

		    // Récupération des anciennes promotions de la séance modifiée
		    $request_promotions = shSGBD::select(
			    'SELECT promotion.id '.
			    'FROM promotion '.
			    'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
			    'WHERE mutualiser.id_seance=:id_seance ',
			    array(':id_seance'=>$seance->id_seance)
		    );

		    // Création d'un tableau
		    $promotions_seance = array();
		    foreach($request_promotions AS $request_promotion)
			$promotions_seance[] = $request_promotion->id;



		    // Récupération des anciens groupes de la séance modifiée
		    $request_groupes = shSGBD::select(
			    'SELECT groupe.id '.
			    'FROM groupe '.
			    'INNER JOIN participer ON participer.id_groupe=groupe.id '.
			    'WHERE participer.id_seance=:id_seance ',
			    array(':id_seance'=>$seance->id_seance)
		    );

		    // Création d'un tableau
		    $groupes_seance = array();
		    foreach($request_groupes AS $request_groupe)
			$groupes_seance[] = $request_groupe->id;



		    // Création d'un tableau des nouveaux groupes
		    $nouveaux_groupes = array();
		    if( ($formulaire->isField('Groupe')) AND ($formulaire->getField('Groupe')->getValue() != '' ) )
			$nouveaux_groupes = $formulaire->getField('Groupe')->getValue();

		    // Parcours des séances
		    foreach($request_seances AS $request_seance) {
			// Ajuste le numéro de séance
			$values[':id_seance'] = $request_seance->id_seance;

			// test toutes les valeurs pour ignorer la MAJ lorsqu'il existe une différence
			$date_calculee = Date::fromSGBD($request_seance->jour)->add($difference_date);
			if(Date::fromSGBD($date)->format('N') == $date_calculee->format('N'))
			    $values[':jour'] = $date_calculee->toSGBD();
			else
			     $values[':jour'] = $request_seance->jour;

			$values[':id_enseignement'] = ($request_seance->id_enseignement == $seance->id_enseignement) ?
				$enseignement->id :
				$request_seance->id_enseignement;

			$values[':id_salle'] = ($request_seance->id_salle == $seance->id_salle) ?
				$formulaire->getField('Salle')->getValue() :
				$request_seance->id_salle;

			$values[':id_enseignant'] = ($request_seance->id_enseignant == $seance->id_enseignant) ?
				$id_enseignant :
				$request_seance->id_enseignant;

			// Pour les heures, les 2 doivent être identiques et le jour de la semaine doit être le même
			if( ($request_seance->heure_debut == $seance->heure_debut)
				AND ($request_seance->heure_fin == $seance->heure_fin)
				AND (Date::fromSGBD($request_seance->jour)->format('N') == Date::fromSGBD($seance->jour)->format('N')) ) {

			    $values[':heure_debut'] = $formulaire->getField('Heure début')->getValue();
			    $values[':heure_fin'] = $formulaire->getField('Heure fin')->getValue();
			}
			else {
			    $values[':heure_debut'] = $request_seance->heure_debut;
			    $values[':heure_fin'] = $request_seance->heure_fin;
			}


			// Mise à jour de la séance
			shSGBD::update(
				'UPDATE seance '.
				'SET seance.id_enseignement=:id_enseignement, '.
				'seance.id_salle=:id_salle, '.
				'seance.id_enseignant=:id_enseignant, '.
				'seance.jour=:jour, '.
				'seance.heure_debut=:heure_debut, '.
				'seance.heure_fin=:heure_fin '.
				'WHERE seance.id=:id_seance',
				$values
			);

			// Mise à jour des promotions

			// Sélection des anciennes promotions de la séance en cours
			// Récupération des anciennes promotions de la séance modifiée
			$request_promotions = shSGBD::select(
				'SELECT promotion.id '.
				'FROM promotion '.
				'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
				'WHERE mutualiser.id_seance=:id_seance ',
				array(':id_seance'=>$values[':id_seance'])
			);

			// Création d'un tableau
			$anciennes_promotions = array();
			foreach($request_promotions AS $request_promotion)
			    $anciennes_promotions[] = $request_promotion->id;

			// On vérifie que les promotions de la séance modifiée et de la séance en cours correspondent parfaitement
			if( array_diff($anciennes_promotions, $promotions_seance) == null ) {
			    // Création d'un tableau des nouvelles promotions
			    $nouvelles_promotions = $tab_promotions;



			    // Intersection des nouvelles et anciennes promotions
			    $intersection_promotions = array_intersect($anciennes_promotions, $nouvelles_promotions);

			    // Nouvelles promotions sans l'es anciennes l'intersection
			    $nouvelles_promotions = array_diff($nouvelles_promotions, $intersection_promotions);

			    // Anciennes promotions sans l'intersection
			    $anciennes_promotions = array_diff($anciennes_promotions, $intersection_promotions);

			    // Insertion des nouvelles promotions
			    foreach($nouvelles_promotions AS $nouvelle_promotion) {
				    shSGBD::insert(
					    'INSERT INTO mutualiser '.
					    '(id_promotion, id_seance) '.
					    'VALUES (:id_promotion, :id_seance) ',
					    array(':id_promotion'=>$nouvelle_promotion, ':id_seance'=>$values[':id_seance'])
				    );
			    }

			    // Suppression des anciennes promotions
			    foreach($anciennes_promotions AS $ancienne_promotion) {
				    shSGBD::insert(
					    'DELETE FROM mutualiser '.
					    'WHERE mutualiser.id_promotion=:id_promotion '.
					    'AND mutualiser.id_seance=:id_seance ',
					    array(':id_promotion'=>$ancienne_promotion, ':id_seance'=>$values[':id_seance'])
				    );
			    }
			} // Fin if (correspondance entre promotions séance modifiée et séance en cours)

			// Récupération des anciens groupes de la séance modifiée
			$request_groupes = shSGBD::select(
				'SELECT groupe.id '.
				'FROM groupe '.
				'INNER JOIN participer ON participer.id_groupe=groupe.id '.
				'WHERE participer.id_seance=:id_seance ',
				array(':id_seance'=>$values[':id_seance'])
			);

			// Création d'un tableau
			$anciens_groupes = array();
			foreach($request_groupes AS $request_groupe)
			    $anciens_groupes[] = $request_groupe->id;

			if( array_diff($anciens_groupes, $groupes_seance) == null ) {
			    $nouveaux_groupes = array();
			    // Création d'un tableau des nouvelles promotions
			    if($formulaire->isField('Groupe'))
				$nouveaux_groupes = $formulaire->getField('Groupe')->getValue();

			    // Intersection des nouvelles et anciennes promotions
			    $intersection_groupes = array_intersect($anciens_groupes, $nouveaux_groupes);

			    // Nouvelles promotions sans l'es anciennes l'intersection
			    $nouveaux_groupes = array_diff($nouveaux_groupes, $intersection_groupes);

			    // Anciennes promotions sans l'intersection
			    $anciens_groupes = array_diff($anciens_groupes, $intersection_groupes);

			    // Insertion des nouvelles promotions
			    foreach($nouveaux_groupes AS $nouveau_groupe) {
				    shSGBD::insert(
					    'INSERT INTO participer '.
					    '(id_groupe, id_seance) '.
					    'VALUES (:id_groupe, :id_seance) ',
					    array(':id_groupe'=>$nouveau_groupe, ':id_seance'=>$values[':id_seance'])
				    );
			    }

			    // Suppression des anciennes promotions
			    foreach($anciens_groupes AS $ancien_groupe) {
				    shSGBD::insert(
					    'DELETE FROM participer '.
					    'WHERE participer.id_groupe=:id_groupe '.
					    'AND participer.id_seance=:id_seance ',
					    array(':id_groupe'=>$ancien_groupe, ':id_seance'=>$values[':id_seance'])
				    );
			    }
			} // FIN if correspondance groupes séance modifiée et séance en cours

		    } // Fin foreach $request_seance
		} // Fin else Ecrasement
						   */

						   // Redirection
						   $parametres = array(
								 $parametre_promotions,
								 Planning::SEMAINE,
								 Date::fromFormulaire($formulaire->getField('Date')->getValue())->toURL()
						   );
						   shAction::redirect(shRequest::__instance()->getModule(),
								 shRequest::__instance()->getAction(),
								 null,
								 $parametres);


						   // Redirection vers la page de planning à la semaine centré sur la date de création du cours

					   }
					   else {

						   $parametres = array($parametre_id_cours);

						   if($parametre_promotions != null)
							   $parametres[] = $parametre_promotions;
						   elseif ( ($formulaire->isField('Promotion(s)')) AND ($formulaire->getField('Promotion(s)')->getValue() != null) )
							   $parametres[] = implode('-', $formulaire->getField('Promotion(s)')->getValue());

						   if($parametre_ue != null)
							   $parametres[] = $parametre_ue;
						   else if( ($formulaire->isField('UE')) AND ($formulaire->getField('UE')->getValue() != null) )
							   $parametres[] = $formulaire->getField('UE')->getValue();

						   if($parametre_type_enseignement != null)
							   $parametres[] = $parametre_type_enseignement;
						   else if( ($formulaire->isField('Type de séance')) AND ($formulaire->getField('Type de séance')->getValue() != null) )
							   $parametres[] = $formulaire->getField('Type de séance')->getValue();

						   shAction::redirect(shRequest::__instance()->getModule(), shRequest::__instance()->getAction(), shRequest::__instance()->getRequest(), $parametres);

					   }
				   })
			;


			// Assigne le formulaire
			$this->assign('formulaire', $formulaire);

		}
		else {
			throw new Exception('Paramètre numéro de séance introuvable', 404);
		}

	}

	/**
	 * Execute la méthode de suppression d'un cours
	 * @param <integer> id du cours à supprimer
	 * @param <string> ids des promotions pour lesquelles il faut supprimer la séance
	 */
	public function executeDelete($_id_cours = null, $_promotions = null) {

		// Définition du titre de la page
		$this->setTitle('Suppression d\'un cours');

		// Permet de constituer le fil d'ariane
		$this->addAriane(shRequest::link('saisiedescours'), 'Saisie des cours');

		// Détermine le modèle des paramètres attendus
		//$this->addParametersModel('id_cours');

		if($_id_cours != null) {
			// Création du formulaire
			$formulaire = new shFormulaire;

			// Modifie le nom du bouton de soumission
			$formulaire->setSubmitText('Supprimer le cours');

			// Récupération du paramètre id cours
			$id_cours = $_id_cours;
			$parametre_id_cours = $id_cours;

			// Requête pour sélectionner le cours et ses informations
			$seance = shSGBD::selectOne(
				   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
				   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
				   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
				   'type_enseignement.id AS id_type_enseignement '.
				   'FROM seance '.
				   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
				   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
				   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
				   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
				   'WHERE seance.id=:id_seance ',
				   array(':id_seance'=>$id_cours)
			);

			$jour_seance = $seance->jour;

			if(!$seance)
				throw new Exception('Numéro de séance introuvable', 404);


			// Sélection des promotions qui sont inscrits pour la séance
			$promotions = shSGBD::select(
				   'SELECT DISTINCT promotion.id AS id_promotion, specialite.intitule AS intitule_specialite, '.
				   'filiere.intitule AS intitule_filiere, '.
				   'user.id AS id_user '.
				   'FROM promotion '.
				   'INNER JOIN specialite ON specialite.id=promotion.id_specialite '.
				   'INNER JOIN filiere ON filiere.id=specialite.id_filiere '.
				   'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
				   'INNER JOIN user ON user.id=responsable.id_user '.
				   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
				   'WHERE mutualiser.id_seance=:id_seance ',
				   array(':id_seance'=>$seance->id_seance)
			);


			if(!$promotions)
				throw new Exception('Aucune promotion n\'est inscrite pour la séance. Pensez à supprimer la séance.', 404);

			// Booléen pour savoir si l'user connecté est responsable d'au moins une promotion
			$responsable = false;
			$id_promotions = array();

			// Vérification que l'user connecté est responsable d'au moins une promotion inscrite à la séance
			foreach($promotions AS $promotion) {
				if($promotion->id_user == shSession::__instance()->getId()) {
					$responsable = true;
				}
				$id_promotions[] = $promotion->id_promotion;
			}

			// Si l'user n'est responsable d'aucune promotion, erreur
			if(!$responsable)
				throw new Exception('Vous n\'êtes responsable d\'aucune des promotions inscrites à la séance.', 404);

			// Sélection des cours filles
			$id_parent = ($seance->id_parent != null) ? $seance->id_parent : $seance->id_seance;

			// Calcul du nombre de séances filles
			$count_seances_filles = shSGBD::count(
				   'SELECT count(seance.id) '.
				   'FROM seance '.
				   'WHERE seance.id_parent=:id_parent ',
				   array(':id_parent'=>$id_parent)
			);





			if($count_seances_filles > 0) {
				$select_recursivite = shField::select('Recursivité')
					   ->addOption(1, 'Supprimer la séance courante uniquement')
					   ->addOption(2, 'Supprimer les séances filles identiques ')
					   ->addOption(3, 'Supprimer toutes les séances filles ')
					   ->appendTo($formulaire);
			}
			else {
				shField::string('Séances filles')
					   ->setValue('Aucune séance fille pour la séance')
					   ->appendTo($formulaire);

				$select_recursivite = shField::select('Recursivité')
					   ->addOption(1, 'Supprimer la séance courante uniquement')
					   ->appendTo($formulaire);

			}


			// Submit du formulaire
			$formulaire->setSubmit(function($formulaire) use ($parametre_id_cours, $_promotions) {

					   // Sélection des promotions qui participent à la séance et qui sont sélectionnées
					   if($_promotions == null) {
						   // Sélection des promotions qui sont inscrits pour la séance
						   $promotions = shSGBD::select(
								 'SELECT DISTINCT promotion.id AS id_promotion, specialite.intitule AS intitule_specialite, '.
								 'filiere.intitule AS intitule_filiere, '.
								 'user.id AS id_user '.
								 'FROM promotion '.
								 'INNER JOIN specialite ON specialite.id=promotion.id_specialite '.
								 'INNER JOIN filiere ON filiere.id=specialite.id_filiere '.
								 'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
								 'INNER JOIN user ON user.id=responsable.id_user '.
								 'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
								 'WHERE mutualiser.id_seance=:id_seance ',
								 array(':id_seance'=>$parametre_id_cours)
						   );
					   }
					   else {
						   $param_requetes = explode('-', $_promotions);
						   $param_requetes[] = $parametre_id_cours;

						   // Sélection des promotions qui sont inscrits pour la séance et qui sont sélectionnées
						   $promotions = shSGBD::select(
								 'SELECT DISTINCT promotion.id AS id_promotion, specialite.intitule AS intitule_specialite, '.
								 'filiere.intitule AS intitule_filiere, '.
								 'user.id AS id_user '.
								 'FROM promotion '.
								 'INNER JOIN specialite ON specialite.id=promotion.id_specialite '.
								 'INNER JOIN filiere ON filiere.id=specialite.id_filiere '.
								 'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
								 'INNER JOIN user ON user.id=responsable.id_user '.
								 'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
								 'WHERE promotion.id IN (? '.str_repeat(',? ', sizeof($param_requetes) - 2).') '.
								 'AND mutualiser.id_seance=? ',
								 $param_requetes
						   );
					   }

					   $seance = shSGBD::selectOne(
							 'SELECT seance.id, seance.id_parent, seance.id_enseignement, seance.id_enseignant, '.
							 'seance.jour, seance.heure_debut, seance.heure_fin, seance.id_salle '.
							 'FROM seance '.
							 'WHERE seance.id=:id_seance ',
							 array(':id_seance'=>$parametre_id_cours)
					   );

					   // Récupère le jour, l'id parent et l'id enseignant de la séance
					   $jour_seance = $seance->jour;
					   $id_parent = ($seance->id_parent == null) ? $id_parent = $seance->id : $seance->id_parent;
					   $id_enseignant = ($seance->id_enseignant == null ) ? null : $seance->id_enseignant;

					   // Test la récursivité
					   switch($formulaire->getField('Récursivité')->getValue()) {
						   case 1:
							   $parametres_requete = array();
							   foreach($promotions AS $promotion)
								   $parametres_requete[] = $promotion->id_promotion;

							   $parametres_requete[] = $parametre_id_cours;

							   $groupes = shSGBD::select(
									 'SELECT groupe.id '.
									 'FROM groupe '.
									 'INNER JOIN participer ON participer.id_groupe=groupe.id '.
									 'WHERE groupe.id_promotion IN (?'.str_repeat(',? ', sizeof($promotions) - 1).') '.
									 'AND participer.id_seance=? ',
									 $parametres_requete
							   );

							   // Suppression des groupes dans participer
							   foreach($groupes AS $groupe) {
								   shSGBD::delete(
										 'DELETE FROM participer '.
										 'WHERE participer.id_groupe=:id_groupe '.
										 'AND participer.id_seance=:id_seance ',
										 array(':id_groupe'=>$groupe->id, ':id_seance'=>$seance->id)
								   );
							   }

							   foreach($promotions AS $promotion) {
								   shSGBD::delete(
										 'DELETE FROM mutualiser '.
										 'WHERE mutualiser.id_promotion=:id_promotion '.
										 'AND mutualiser.id_seance=:id_seance ',
										 array(':id_promotion'=>$promotion->id_promotion, ':id_seance'=>$seance->id)
								   );
							   }

							   $nombre_promotions = shSGBD::count(
									 'SELECT count(mutualiser.id_promotion) '.
									 'FROM mutualiser '.
									 'WHERE mutualiser.id_seance=:id_seance ',
									 array(':id_seance'=>$seance->id)
							   );

							   // Si il n'y as plus aucune promotion inscrite au cours, on supprime la séance
							   if($nombre_promotions == 0) {
								   shSGBD::delete(
										 'DELETE FROM seance '.
										 'WHERE seance.id=:id_seance ',
										 array(':id_seance'=>$seance->id)
								   );

							   }

							   break;
						   case 2:
						   // Récupération des anciens groupes de la séance modifiée
							   $request_groupes = shSGBD::select(
									 'SELECT groupe.id '.
									 'FROM groupe '.
									 'INNER JOIN participer ON participer.id_groupe=groupe.id '.
									 'WHERE participer.id_seance=:id_seance ',
									 array(':id_seance'=>$seance->id)
							   );

							   // Création d'un tableau
							   $groupes_seance = array();
							   foreach($request_groupes AS $request_groupe)
								   $groupes_seance[] = $request_groupe->id;

							   // Récupération des anciennes promotions de la séance modifiée
							   $request_promotions = shSGBD::select(
									 'SELECT promotion.id '.
									 'FROM promotion '.
									 'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
									 'WHERE mutualiser.id_seance=:id_seance ',
									 array(':id_seance'=>$seance->id)
							   );

							   // Création d'un tableau
							   $promotions_seance = array();
							   foreach($request_promotions AS $request_promotion)
								   $promotions_seance[] = $request_promotion->id;

							   // Sélection des séances filles
							   $values_filles = array(':id_parent'=>$id_parent,
									 ':jour'=>$seance->jour,
									 ':id_seance'=>$seance->id,
									 ':heure_debut'=>$seance->heure_debut,
									 ':heure_fin'=>$seance->heure_fin,
									 ':id_enseignement'=>$seance->id_enseignement);

							   if($seance->id_enseignant == null)
								   $query_enseignant = 'AND seance.id_enseignant IS NULL ';
							   else {
								   $values_filles[':id_enseignant'] = $seance->id_enseignant;
								   $query_enseignant = 'AND seance.id_enseignant =:id_enseignant ';
							   }

							   if($seance->id_salle == null)
								   $query_salle = 'AND seance.id_salle IS NULL ';
							   else {
								   $values_filles[':id_salle'] = $seance->id_salle;
								   $query_salle = 'AND seance.id_salle =:id_salle ';
							   }

							   $query_filles = 'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
									 'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
									 'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
									 'enseignement.id AS id_enseignement, '.
									 'type_enseignement.id AS id_type_enseignement '.
									 'FROM seance '.
									 'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
									 'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
									 'INNER JOIN ue ON ue.id=enseignement.id_ue '.
									 'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
									 'WHERE seance.jour>=:jour '.
									 'AND seance.heure_debut=:heure_debut '.
									 'AND seance.heure_fin=:heure_fin '.
									 $query_enseignant.
									 'AND seance.id_enseignement=:id_enseignement '.
									 $query_salle.
									 'AND (seance.id_parent=:id_parent '.
									 'OR seance.id=:id_seance) ';

							   $seances_filles = shSGBD::select($query_filles, $values_filles);

							   // Récupération du numéro de jour de la séance
							   $jour_seance = Date::fromSGBD($seance->jour)->format('w');

							   foreach($seances_filles AS $seance_fille) {
								   $parametres_requete = array($seance_fille->id_seance);
								   $parametres_requete[] = shSession::__instance()->getId();

								   // Sélection des promotions dont l'user est responsable et qui suivent la séance
								   $promotions = shSGBD::select(
										 'SELECT promotion.id '.
										 'FROM promotion '.
										 'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
										 'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
										 'WHERE mutualiser.id_seance=? '.
										 'AND responsable.id_user=? ',
										 $parametres_requete
								   );

								   $promotions_fille = array();
								   foreach($promotions AS $promotion) $promotions_fille[] = $promotion->id;

								   $parametres_requete = $promotions_fille;
								   $parametres_requete[] = $seance_fille->id_seance;
								   // Sélection des groupes des promotions en cours et qui suivent la séance
								   $groupes = shSGBD::select(
										 'SELECT groupe.id '.
										 'FROM groupe '.
										 'INNER JOIN participer ON participer.id_groupe=groupe.id '.
										 'WHERE groupe.id_promotion IN (? '.str_repeat(', ? ', sizeof($parametres_requete) - 2).') '.
										 'AND participer.id_seance=? ',
										 $parametres_requete
								   );

								   $groupes_fille = array();
								   foreach($groupes AS $groupe) $groupes_fille[] = $groupe->id;

								   // SI la date, les promotions et les groupes correspondent, on supprime
								   if( (Date::fromSGBD($seance_fille->jour)->format('w') == $jour_seance) AND
										 (array_diff($groupes_seance, $groupes_fille) == null) AND
										 (array_diff($groupes_fille, $groupes_seance) == null) AND
										 (array_diff($promotions_seance, $promotions_fille) == null) AND
										 (array_diff($promotions_fille, $promotions_seance) == null)) {


									   // Suppression des liens entre les promotions et la séance
									   foreach($promotions_fille AS $promotion_fille) {
										   shSGBD::delete(
												 'DELETE FROM mutualiser '.
												 'WHERE mutualiser.id_promotion=:id_promotion '.
												 'AND mutualiser.id_seance=:id_seance ',
												 array(':id_promotion'=>$promotion_fille, ':id_seance'=>$seance_fille->id_seance)
										   );
									   }

									   foreach($groupes_fille AS $groupe_fille) {
										   shSGBD::delete(
												 'DELETE FROM participer '.
												 'WHERE parcitiper.id_groupe=:id_groupe '.
												 'AND participer.id_seance=:id_seance ',
												 array(':id_groupe'=>$groupe_fille, ':id_seance'=>$seance_fille->id_seance)
										   );
									   }

									   $nombre_promotions = shSGBD::count(
											 'SELECT count(mutualiser.id_promotion) '.
											 'FROM mutualiser '.
											 'WHERE mutualiser.id_seance=:id_seance ',
											 array(':id_seance'=>$seance_fille->id_seance)
									   );

									   // Si il n'y as plus aucune promotion inscrite au cours, on supprime la séance
									   if($nombre_promotions == 0) {
										   shSGBD::delete(
												 'DELETE FROM seance '.
												 'WHERE seance.id=:id_seance ',
												 array(':id_seance'=>$seance_fille->id_seance)
										   );

									   }

								   } // Fin if date, promotions et groupes correspondent
							   } // Fin foreach seances_fille


							   break;
						   case 3:
							   $seances_filles = shSGBD::select(
									 'SELECT seance.id AS id_seance '.
									 'FROM seance '.
									 'WHERE seance.id_parent=:id_parent '.
									 'OR seance.id=:id_seance ',
									 array(':id_parent'=>$id_parent, ':id_seance'=>$seance->id)
							   );

							   foreach($seances_filles AS $seance_fille) {
								   // Paramètres pour la requête de sélection des promotions
								   $parametres_requete = array($seance_fille->id_seance);
								   $parametres_requete[] = shSession::__instance()->getId();

								   // Sélection des promotions dont l'user est responsable et qui suivent la séance
								   $promotions = shSGBD::select(
										 'SELECT promotion.id '.
										 'FROM promotion '.
										 'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
										 'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
										 'WHERE mutualiser.id_seance=? '.
										 'AND responsable.id_user=? ',
										 $parametres_requete
								   );

								   // Création d'un tableau pour stocker les ids des promotions
								   $promotions_fille = array();
								   foreach($promotions AS $promotion) $promotions_fille[] = $promotion->id;

								   $parametres_requete = $promotions_fille;
								   $parametres_requete[] = $seance_fille->id_seance;
								   // Sélection des groupes des promotions en cours et qui suivent la séance
								   $groupes = shSGBD::select(
										 'SELECT groupe.id '.
										 'FROM groupe '.
										 'INNER JOIN participer ON participer.id_groupe=groupe.id '.
										 'WHERE groupe.id_promotion IN (? '.str_repeat(', ? ', sizeof($parametres_requete) - 2).') '.
										 'AND participer.id_seance=? ',
										 $parametres_requete
								   );

								   // Suppression des groupes dans participer
								   foreach($groupes AS $groupe) {
									   shSGBD::delete(
											 'DELETE FROM participer '.
											 'WHERE participer.id_groupe=:id_groupe '.
											 'AND participer.id_seance=:id_seance ',
											 array(':id_groupe'=>$groupe->id, ':id_seance'=>$seance_fille->id_seance)
									   );
								   }

								   foreach($promotions AS $promotion) {
									   shSGBD::delete(
											 'DELETE FROM mutualiser '.
											 'WHERE mutualiser.id_promotion=:id_promotion '.
											 'AND mutualiser.id_seance=:id_seance ',
											 array(':id_promotion'=>$promotion->id, ':id_seance'=>$seance_fille->id_seance)
									   );
								   }

								   $nombre_promotions = shSGBD::count(
										 'SELECT count(mutualiser.id_promotion) '.
										 'FROM mutualiser '.
										 'WHERE mutualiser.id_seance=:id_seance ',
										 array(':id_seance'=>$seance_fille->id_seance)
								   );

								   // Si il n'y as plus aucune promotion inscrite au cours, on supprime la séance
								   if($nombre_promotions == 0) {
									   shSGBD::delete(
											 'DELETE FROM seance '.
											 'WHERE seance.id=:id_seance ',
											 array(':id_seance'=>$seance_fille->id_seance)
									   );

								   }

							   }
							   break;
						   default:
							   break;
					   }


					   /*
		    // Test l'écrasement
		    if($formulaire->getField('Ecrasement')->getValue()) {
			// Sélection des séances ultérieures partageant le même
			$request_seances = shSGBD::select(
				'SELECT seance.id '.
				'FROM seance '.
				'WHERE seance.id_parent=:id_parent '.
				'OR seance.id=:id_seance ',
				array(':id_parent'=>$id_parent, ':id_seance'=>$parametre_id_cours)
			);

			foreach($request_seances AS $request_seance) {
			    $parametre_id_cours = $request_seance->id;

			    $parametres_requete = array();
			    foreach($promotions AS $promotion)
				$parametres_requete[] = $promotion->id;

			    $parametres_requete[] = $parametre_id_cours;

			    $groupes = shSGBD::select(
				    'SELECT groupe.id '.
				    'FROM groupe '.
				    'INNER JOIN participer ON participer.id_groupe=groupe.id '.
				    'WHERE groupe.id_promotion IN (?'.str_repeat(',? ', sizeof($promotions) - 1).') '.
				    'AND participer.id_seance=? ',
				    $parametres_requete
			    );

			    // Suppression des groupes
			    foreach($groupes AS $groupe) {
				shSGBD::delete(
				     'DELETE FROM participer '.
				     'WHERE participer.id_groupe=:id_groupe '.
				     'AND participer.id_seance=:id_seance ',
				     array(':id_groupe'=>$groupe->id, ':id_seance'=>$parametre_id_cours)
				);
			    }

		
			}

		    } // fin if écrasement
		    else {

			// Création des paramètres de la requête des groupes
			$parametres_requete = array();
			foreach($promotions AS $promotion)
			    $parametres_requete[] = $promotion->id;

			$parametres_requete[] = $parametre_id_cours;

			// Sélection des groupes qui suivent la séance et qui sont dans une promotion dont l'user est responsable
			$groupes = shSGBD::select(
				'SELECT groupe.id '.
				'FROM groupe '.
				'INNER JOIN participer ON participer.id_groupe=groupe.id '.
				'WHERE groupe.id_promotion IN (?'.str_repeat(',? ', sizeof($promotions) - 1).') '.
				'AND participer.id_seance=? ',
				$parametres_requete
			);

			// Création d'un tableau des ids du groupe de la séance
			$groupes_seance = array();
			foreach($groupes AS $groupe)
			    $groupes_seance[] = $groupe->id;

			// Récupère le numéro du jour au format anglais + 1 pour correspondre au format DAYOFWEEK (1 = dimanche à 7 samedi)
			$jour = Date::fromSGBD($seance->jour)->format('w') + 1;


			$values = array(':id_parent'=>$id_parent,
				    ':id_seance'=>$parametre_id_cours,
				    ':jour'=>$jour,
				    ':heure_debut'=>$seance->heure_debut,
				    ':heure_fin'=>$seance->heure_fin,
				    ':id_enseignement'=>$seance->id_enseignement,
				);

			$query =  'SELECT seance.id '.
				'FROM seance '.
				'WHERE (seance.id_parent=:id_parent '.
				'OR seance.id=:id_seance) '.
				'AND DAYOFWEEK(seance.jour)=:jour '.
				'AND seance.heure_debut=:heure_debut '.
				'AND seance.heure_fin=:heure_fin '.
				'AND seance.id_enseignement=:id_enseignement ';

			if($id_enseignant != null) {
			    $query .= 'AND seance.id_enseignant=:id_enseignant ';
			    $values[':id_enseignant'] = $id_enseignant;
			}

			// Sélection des séances ultérieures partageant le même
			$request_seances = shSGBD::select($query, $values);

			foreach($request_seances AS $request_seance) {
			    // Sélection des promotions de la séance en cours et dont l'user est responsable
			    $promotions_seance = shSGBD::select(
				'SELECT promotion.id '.
				'FROM promotion '.
				'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
				'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
				'WHERE mutualiser.id_seance=:id_seance '.
				'AND responsable.id_user=:id_user ',
				array(':id_seance'=>$request_seance->id, ':id_user'=>shSession::__instance()->getId())
			    );

			    // Création des paramètres de la requête des groupes
			    $parametres_requete = array();
			    foreach($promotions_seance AS $promotion_seance)
				$parametres_requete[] = $promotion_seance->id;

			    $parametres_requete[] = $parametre_id_cours;

			    // Sélection des groupes qui suivent la séance et qui sont dans une promotion dont l'user est responsable
			    $groupes = shSGBD::select(
				    'SELECT groupe.id '.
				    'FROM groupe '.
				    'INNER JOIN participer ON participer.id_groupe=groupe.id '.
				    'WHERE groupe.id_promotion IN (?'.str_repeat(',? ', sizeof($promotions_seance) - 1).') '.
				    'AND participer.id_seance=? ',
				    $parametres_requete
			    );

			    // Création d'un tableau des ids du groupe de la séance
			    $tab_groupes = array();
			    foreach($groupes AS $groupe)
				$tab_groupes[] = $groupe->id;

			    // si les groupes sont identiques, on modifie la séance
			    if( array_diff($groupes_seance, $tab_groupes) == null) {
				// Suppression des groupes
				foreach($groupes AS $groupe) {
				    shSGBD::delete(
					 'DELETE FROM participer '.
					 'WHERE participer.id_groupe=:id_groupe '.
					 'AND participer.id_seance=:id_seance ',
					 array(':id_groupe'=>$groupe->id, ':id_seance'=>$request_seance->id)
				    );
				}

				foreach($promotions_seance AS $promotion_seance) {
				    shSGBD::delete(
					'DELETE FROM mutualiser '.
					'WHERE mutualiser.id_promotion=:id_promotion '.
					'AND mutualiser.id_seance=:id_seance ',
					array(':id_promotion'=>$promotion_seance->id, ':id_seance'=>$request_seance->id)
				    );
				}

				$nombre_promotions = shSGBD::count(
					'SELECT count(mutualiser.id_promotion) '.
					'FROM mutualiser '.
					'WHERE mutualiser.id_seance=:id_seance ',
					array(':id_seance'=>$request_seance->id)
				);

				// Si il n'y as plus aucune promotion inscrite au cours, on supprime la séance
				if($nombre_promotions == 0) {
				    shSGBD::delete(
					    'DELETE FROM seance '.
					    'WHERE seance.id=:id_seance ',
					    array(':id_seance'=>$request_seance->id)
				    );

				}

			    }

			}

		    }



		} // Fin if récursivité
		else {

		    $parametres_requete = array();
		    foreach($promotions AS $promotion)
			$parametres_requete[] = $promotion->id;

		    $parametres_requete[] = $parametre_id_cours;

		    $groupes = shSGBD::select(
			    'SELECT groupe.id '.
			    'FROM groupe '.
			    'INNER JOIN participer ON participer.id_groupe=groupe.id '.
			    'WHERE groupe.id_promotion IN (?'.str_repeat(',? ', sizeof($promotions) - 1).') '.
			    'AND participer.id_seance=? ',
			    $parametres_requete
		    );

		    // Suppression des groupes
		    foreach($groupes AS $groupe) {
			shSGBD::delete(
			     'DELETE FROM participer '.
			     'WHERE participer.id_groupe=:id_groupe '.
			     'AND participer.id_seance=:id_seance ',
			     array(':id_groupe'=>$groupe->id, ':id_seance'=>$parametre_id_cours)
			);
		    }

		    foreach($promotions AS $promotion) {
			shSGBD::delete(
			    'DELETE FROM mutualiser '.
			    'WHERE mutualiser.id_promotion=:id_promotion '.
			    'AND mutualiser.id_seance=:id_seance ',
			    array(':id_promotion'=>$promotion->id, ':id_seance'=>$parametre_id_cours)
			);
		    }

		    $nombre_promotions = shSGBD::count(
			    'SELECT count(mutualiser.id_promotion) '.
			    'FROM mutualiser '.
			    'WHERE mutualiser.id_seance=:id_seance ',
			    array(':id_seance'=>$parametre_id_cours)
		    );

		    // Si il n'y as plus aucune promotion inscrite au cours, on supprime la séance
		    if($nombre_promotions == 0) {
			shSGBD::delete(
				'DELETE FROM seance '.
				'WHERE seance.id=:id_seance ',
				array(':id_seance'=>$parametre_id_cours)
			);

		    }

		}
					   */

					   $parametres = array(
							 $_promotions,
							 Planning::SEMAINE,
							 Date::fromSGBD($seance->jour)->toURL()
					   );
					   shAction::redirect(shRequest::__instance()->getModule(),
							 shRequest::__instance()->getAction(),
							 null,
							 $parametres);
				   })
			;


			$this->assign('formulaire', $formulaire);

		} // Fin if parametre id cours

	} // Fin fonction executeDelete

	/**
	 * Execute la méthode d'édition d'une séance
	 * @param <integer> id seance
	 * @param <string> ids des promotions
	 * @param <integer> id de l'ue
	 * @param <integer> id du type d'enseignement
	 * @param <object> formulaire
	 */
	public static function executeEditSeance($_id_seance, $_promotions, $_id_ue, $_type_enseignement, $formulaire) {
		$date = Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD();

		// Requête pour sélectionner le cours et ses informations
		$seance = shSGBD::selectOne(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'enseignement.id AS id_enseignement, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.id=:id_seance ',
			   array(':id_seance'=>$_id_seance)
		);


		// Sélection de l'enseignement en fonction de l'ue et du type d'enseignement
		$enseignement = shSGBD::selectOne(
			   'SELECT enseignement.id '.
			   'FROM enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'WHERE enseignement.id_ue=:id_ue '.
			   'AND type_enseignement.id=:id_type_enseignement ',
			   array(':id_ue'=>$_id_ue,
			   ':id_type_enseignement'=>$_type_enseignement)
		);


		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_enseignant = ($formulaire->getField('Enseignant')->getValue() > 0) ?
			   $formulaire->getField('Enseignant')->getValue()
			   : null;

		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_salle = ($formulaire->getField('Salle')->getValue() > 0) ?
			   $formulaire->getField('Salle')->getValue()
			   : null;

		// Préparation des valeurs pour l'insert de la séance
		$values = array(
			   ':id_seance'=>$_id_seance,
			   ':id_enseignement'=>$enseignement->id,
			   ':id_salle'=>$id_salle,
			   ':id_enseignant'=>$id_enseignant,
			   ':jour'=>$date,
			   ':heure_debut'=>$formulaire->getField('Heure début')->getValue(),
			   ':heure_fin'=>$formulaire->getField('Heure fin')->getValue()
		);

		// Mise à jour de la séance
		shSGBD::update(
			   'UPDATE seance '.
			   'SET seance.id_enseignement=:id_enseignement, '.
			   'seance.id_salle=:id_salle, '.
			   'seance.id_enseignant=:id_enseignant, '.
			   'seance.jour=:jour, '.
			   'seance.heure_debut=:heure_debut, '.
			   'seance.heure_fin=:heure_fin '.
			   'WHERE seance.id=:id_seance',
			   $values
		);

		// Récupération des anciennes promotions de la séance modifiée
		$request_promotions = shSGBD::select(
			   'SELECT promotion.id '.
			   'FROM promotion '.
			   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
			   'WHERE mutualiser.id_seance=:id_seance ',
			   array(':id_seance'=>$_id_seance)
		);

		// Création d'un tableau
		$anciennes_promotions = array();
		foreach($request_promotions AS $request_promotion)
			$anciennes_promotions[] = $request_promotion->id;

		// Récupération des promotions
		$nouvelles_promotions = explode('-', $_promotions);

		// Intersection des nouvelles et anciennes promotions
		$intersection_promotions = array_intersect($anciennes_promotions, $nouvelles_promotions);

		// Nouvelles promotions sans l'es anciennes l'intersection
		$nouvelles_promotions = array_diff($nouvelles_promotions, $intersection_promotions);

		// Anciennes promotions sans l'intersection
		$anciennes_promotions = array_diff($anciennes_promotions, $intersection_promotions);

		// Insertion des nouvelles promotions
		foreach($nouvelles_promotions AS $nouvelle_promotion) {
			shSGBD::insert(
				   'INSERT INTO mutualiser '.
				   '(id_promotion, id_seance) '.
				   'VALUES (:id_promotion, :id_seance) ',
				   array(':id_promotion'=>$nouvelle_promotion, ':id_seance'=>$values[':id_seance'])
			);
		}

		// Suppression des anciennes promotions
		foreach($anciennes_promotions AS $ancienne_promotion) {
			shSGBD::insert(
				   'DELETE FROM mutualiser '.
				   'WHERE mutualiser.id_promotion=:id_promotion '.
				   'AND mutualiser.id_seance=:id_seance ',
				   array(':id_promotion'=>$ancienne_promotion, ':id_seance'=>$values[':id_seance'])
			);
		}

		// Récupération des anciens groupes de la séance modifiée
		$request_groupes = shSGBD::select(
			   'SELECT groupe.id '.
			   'FROM groupe '.
			   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
			   'WHERE participer.id_seance=:id_seance ',
			   array(':id_seance'=>$values[':id_seance'])
		);

		// Création d'un tableau
		$anciens_groupes = array();
		foreach($request_groupes AS $request_groupe)
			$anciens_groupes[] = $request_groupe->id;

		$nouveaux_groupes = array();
		// Création d'un tableau des nouvelles promotions
		if($formulaire->isField('Groupe'))
			$nouveaux_groupes = $formulaire->getField('Groupe')->getValue();

		// Intersection des nouvelles et anciennes promotions
		$intersection_groupes = array_intersect($anciens_groupes, $nouveaux_groupes);

		// Nouvelles promotions sans l'es anciennes l'intersection
		$nouveaux_groupes = array_diff($nouveaux_groupes, $intersection_groupes);

		// Anciennes promotions sans l'intersection
		$anciens_groupes = array_diff($anciens_groupes, $intersection_groupes);

		// Insertion des nouvelles promotions
		foreach($nouveaux_groupes AS $nouveau_groupe) {
			shSGBD::insert(
				   'INSERT INTO participer '.
				   '(id_groupe, id_seance) '.
				   'VALUES (:id_groupe, :id_seance) ',
				   array(':id_groupe'=>$nouveau_groupe, ':id_seance'=>$values[':id_seance'])
			);
		}

		// Suppression des anciennes promotions
		foreach($anciens_groupes AS $ancien_groupe) {
			shSGBD::delete(
				   'DELETE FROM participer '.
				   'WHERE participer.id_groupe=:id_groupe '.
				   'AND participer.id_seance=:id_seance ',
				   array(':id_groupe'=>$ancien_groupe, ':id_seance'=>$values[':id_seance'])
			);
		}



	}


	/**
	 * Execute la méthode d'édition d'une séance
	 * @param <integer> id seance
	 * @param <string> ids des promotions
	 * @param <integer> id de l'ue
	 * @param <integer> id du type d'enseignement
	 * @param <object> formulaire
	 */
	public static function executeEditRecursivite($_id_seance, $_promotions, $_id_ue, $_type_enseignement, $formulaire) {
		$date = Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD();

		// Requête pour sélectionner le cours et ses informations
		$seance = shSGBD::selectOne(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'enseignement.id AS id_enseignement, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.id=:id_seance ',
			   array(':id_seance'=>$_id_seance)
		);


		// Sélection de l'enseignement en fonction de l'ue et du type d'enseignement
		$id_enseignement = shSGBD::selectOne(
			   'SELECT enseignement.id '.
			   'FROM enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'WHERE enseignement.id_ue=:id_ue '.
			   'AND type_enseignement.id=:id_type_enseignement ',
			   array(':id_ue'=>$_id_ue,
			   ':id_type_enseignement'=>$_type_enseignement)
		);


		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_enseignant = ($formulaire->getField('Enseignant')->getValue() > 0) ?
			   $formulaire->getField('Enseignant')->getValue()
			   : null;

		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_salle = ($formulaire->getField('Salle')->getValue() > 0) ?
			   $formulaire->getField('Salle')->getValue()
			   : null;

		$values = array();
		$query = 'UPDATE seance SET ';

		$jour_modifie = false;
		// mise à jour de la date
		if($seance->jour != Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD()) {
			$values[':jour'] = Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD();
			$query .= 'seance.jour=:jour, ';
			$jour_modifie = true;
		}

		// mise à jour de l'heure début
		if($seance->heure_debut != $formulaire->getField('Heure début')->getValue()) {
			$values[':heure_debut'] = $formulaire->getField('Heure début')->getValue();
			$query .= 'seance.heure_debut=:heure_debut, ';
		}

		// mise à jour de l'heure fin
		if($seance->heure_fin != $formulaire->getField('Heure fin')->getValue()) {
			$values[':heure_fin'] = $formulaire->getField('Heure fin')->getValue();
			$query .= 'seance.heure_fin=:heure_fin, ';
		}

		// mise à jour de la salle
		if($seance->id_salle != $id_salle) {
			$values[':salle'] = $id_salle;
			$query .= 'seance.id_salle=:salle, ';
		}

		// mise à jour de l'enseignant
		if($seance->id_enseignant != $id_enseignant) {
			$values[':enseignant'] = $id_enseignant;
			$query .= 'seance.id_enseignant=:enseignant, ';
		}

		// mise à jour de l'enseignement
		if($seance->id_enseignement != $id_enseignement->id) {
			$values[':enseignement'] = $id_enseignement->id;
			$query .= 'seance.id_enseignement=:enseignement, ';
		}

		// Booléen pour savoir s'il faut mettre à jour les champs de la table seance
		$seance_modifie = false;
		if(sizeof($values) > 0) {
			$seance_modifie = true;
			// On enlève les deux derniers caractères (espace et virgule)
			$query = substr($query, 0, -2);
			$query .= ' WHERE seance.id=:id_seance ';
			$values[':id_seance'] = $_id_seance;
		}

		/**** MODIFICATION DES GROUPES ****/
		// Récupération des anciens groupes de la séance modifiée
		$request_groupes = shSGBD::select(
			   'SELECT groupe.id '.
			   'FROM groupe '.
			   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
			   'WHERE participer.id_seance=:id_seance ',
			   array(':id_seance'=>$seance->id_seance)
		);

		// Création d'un tableau
		$groupes_seance = array();
		foreach($request_groupes AS $request_groupe)
			$groupes_seance[] = $request_groupe->id;

		// Création d'un tableau des nouveaux groupes
		$nouveaux_groupes = array();
		if( ($formulaire->isField('Groupe')) AND ($formulaire->getField('Groupe')->getValue() != '' ) )
			$nouveaux_groupes = $formulaire->getField('Groupe')->getValue();

		// Par défaut le booléen de modification est à false
		$groupe_modifie = false;

		// Différence entre les deux tableaux de groupes
		if( (array_diff($nouveaux_groupes, $groupes_seance) != null) OR (array_diff($groupes_seance, $nouveaux_groupes) != null) )
			$groupe_modifie = true;


		/**** MODIFICATION DES PROMOTIONS ****/
		// Récupération des anciennes promotions de la séance modifiée
		$request_promotions = shSGBD::select(
			   'SELECT promotion.id '.
			   'FROM promotion '.
			   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
			   'WHERE mutualiser.id_seance=:id_seance ',
			   array(':id_seance'=>$_id_seance)
		);

		// Création d'un tableau
		$promotions_seance = array();
		foreach($request_promotions AS $request_promotion)
			$promotions_seance[] = $request_promotion->id;

		$nouvelles_promotions = explode('-', $_promotions);

		// Par défaut le booléen de modification est à false
		$promotion_modifie = false;
		// Différence entre les deux tableaux de groupes
		if( (array_diff($nouvelles_promotions, $promotions_seance) != null) OR (array_diff($promotions_seance, $nouvelles_promotions) != null) )
			$promotion_modifie = true;

		// Si aucune modification n'a été faite on quitte la fonction
		if( (!$seance_modifie) AND (!$groupe_modifie) AND (!$promotion_modifie) )
			return;


		// Requête pour vérifier que les dates de fin de promotions ne sont pas inférieurs à la date de fin de récursivité
		$result = shSGBD::selectOne(
			   'SELECT promotion.date_fin '.
			   'FROM promotion '.
			   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($nouvelles_promotions) - 1).') '.
			   'ORDER BY promotion.date_fin ',
			   $nouvelles_promotions);

		$date_fin = $result->date_fin;

		if ( ($formulaire->getField('Date de fin de récursivité')->getValue() != '')
			   AND ($formulaire->getField('Date de fin de récursivité')->getValue() < $date_fin) )
			$date_fin =Date::fromFormulaire($formulaire->getField('Date de fin de récursivité')->getValue())->toSGBD();

		// Sélection de l'id parent
		$id_parent = ($seance->id_parent == null) ? $seance->id_seance : $seance->id_parent;


		// Sélection des séances filles
		$seances_filles = shSGBD::select(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'enseignement.id AS id_enseignement, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.jour<:date_fin '.
			   'AND seance.jour>=:jour '.
			   'AND (seance.id_parent=:id_parent '.
			   'OR seance.id=:id_seance) ',
			   array(':id_parent'=>$id_parent,
			   ':date_fin'=>$date_fin,
			   ':jour'=>$seance->jour,
			   ':id_seance'=>$seance->id_seance)
		);

		// Récupération du jour de la semaine au format anglais 0 -> dimanche
		$jour_semaine = Date::fromFormulaire($formulaire->getField('Date')->getValue())->format('w');


		// Parcours des séances filles
		foreach($seances_filles AS $seance_fille) {
			// Si les champs de la table séance doivent être modifiée
			if($seance_modifie) {
				$values[':id_seance'] = $seance_fille->id_seance;

				if($jour_modifie)
				// Actualise la date (sur le même jour de la semaine que la séance modifiée)
					$values[':jour'] = Date::fromSGBD($seance_fille->jour)->jourDeLaSemaine($jour_semaine, true)->toSGBD();

				// Mise à jour de la séance
				shSGBD::update($query, $values);

			}

			// Si les groupes sont modifiés on met à jour dans la table participer
			if($groupe_modifie) {
				$parametres_requete = explode('-', $_promotions);
				$parametres_requete[] = $seance_fille->id_seance;
				// Sélection des groupes des promotions en cours et qui suivent la séance
				$groupes = shSGBD::select(
					   'SELECT groupe.id '.
					   'FROM groupe '.
					   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
					   'WHERE groupe.id_promotion IN (? '.str_repeat(', ? ', sizeof($parametres_requete) - 2).') '.
					   'AND participer.id_seance=? ',
					   $parametres_requete
				);


				// Suppression des groupes dans participer
				foreach($groupes AS $groupe)
					shSGBD::delete(
						   'DELETE FROM participer '.
						   'WHERE participer.id_groupe=:id_groupe '.
						   'AND participer.id_seance=:id_seance ',
						   array(':id_groupe'=>$groupe->id, ':id_seance'=>$seance_fille->id_seance)
					);

				// Insertion des nouveaux groupes dans participer
				foreach($nouveaux_groupes AS $nouveau_groupe) {
					shSGBD::insert(
						   'INSERT INTO participer '.
						   '(id_groupe, id_seance) '.
						   'VALUES (:id_groupe, :id_seance) ',
						   array(':id_groupe'=>$nouveau_groupe, ':id_seance'=>$seance_fille->id_seance)
					);
				}
			}

			// Si les promotions sont modifiées on met à jour dans la table mutualiser
			if($promotion_modifie) {
				$parametres_requete = array($seance_fille->id_seance);
				$parametres_requete[] = shSession::__instance()->getId();

				// Sélection des promotions en cours et qui suivent la séance
				$promotions = shSGBD::select(
					   'SELECT promotion.id '.
					   'FROM promotion '.
					   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
					   'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
					   'WHERE mutualiser.id_seance=? '.
					   'AND responsable.id_user=? ',
					   $parametres_requete
				);



				// Suppression des promotions dans mutualiser
				foreach($promotions AS $promotion)
					shSGBD::delete(
						   'DELETE FROM mutualiser '.
						   'WHERE mutualiser.id_promotion=:id_promotion '.
						   'AND mutualiser.id_seance=:id_seance ',
						   array(':id_promotion'=>$promotion->id, ':id_seance'=>$seance_fille->id_seance)
					);


				// Insertion des nouvelles promotions dans mutualiser
				foreach($nouvelles_promotions AS $nouvelle_promotion) {
					shSGBD::insert(
						   'INSERT INTO mutualiser '.
						   '(id_promotion, id_seance) '.
						   'VALUES (:id_promotion, :id_seance) ',
						   array(':id_promotion'=>$nouvelle_promotion, ':id_seance'=>$seance_fille->id_seance)
					);
				}
			}

		}

	}

	/**
	 * Execute la méthode d'édition d'une séance
	 * @param <integer> id seance
	 * @param <string> ids des promotions
	 * @param <integer> id de l'ue
	 * @param <integer> id du type d'enseignement
	 * @param <object> formulaire
	 */
	public static function executeEditRecursiviteIdentique($_id_seance, $_promotions, $_id_ue, $_type_enseignement, $formulaire) {
		$date = Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD();

		// Requête pour sélectionner le cours et ses informations
		$seance = shSGBD::selectOne(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'enseignement.id AS id_enseignement, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.id=:id_seance ',
			   array(':id_seance'=>$_id_seance)
		);


		// Sélection de l'enseignement en fonction de l'ue et du type d'enseignement
		$id_enseignement = shSGBD::selectOne(
			   'SELECT enseignement.id '.
			   'FROM enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'WHERE enseignement.id_ue=:id_ue '.
			   'AND type_enseignement.id=:id_type_enseignement ',
			   array(':id_ue'=>$_id_ue,
			   ':id_type_enseignement'=>$_type_enseignement)
		);


		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_enseignant = ($formulaire->getField('Enseignant')->getValue() > 0) ?
			   $formulaire->getField('Enseignant')->getValue()
			   : null;

		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_salle = ($formulaire->getField('Salle')->getValue() > 0) ?
			   $formulaire->getField('Salle')->getValue()
			   : null;

		$values = array();
		$query = 'UPDATE seance SET ';

		$jour_modifie = false;
		// mise à jour de la date
		if($seance->jour != Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD()) {
			$values[':jour'] = Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD();
			$query .= 'seance.jour=:jour, ';
			$jour_modifie = true;
		}

		// mise à jour de l'heure début
		if($seance->heure_debut != $formulaire->getField('Heure début')->getValue()) {
			$values[':heure_debut'] = $formulaire->getField('Heure début')->getValue();
			$query .= 'seance.heure_debut=:heure_debut, ';
		}

		// mise à jour de l'heure fin
		if($seance->heure_fin != $formulaire->getField('Heure fin')->getValue()) {
			$values[':heure_fin'] = $formulaire->getField('Heure fin')->getValue();
			$query .= 'seance.heure_fin=:heure_fin, ';
		}

		// mise à jour de la salle
		if($seance->id_salle != $id_salle) {
			$values[':salle'] = $id_salle;
			$query .= 'seance.id_salle=:salle, ';
		}

		// mise à jour de l'enseignant
		if($seance->id_enseignant != $id_enseignant) {
			$values[':enseignant'] = $id_enseignant;
			$query .= 'seance.id_enseignant=:enseignant, ';
		}

		// mise à jour de l'enseignement
		if($seance->id_enseignement != $id_enseignement->id) {
			$values[':enseignement'] = $id_enseignement->id;
			$query .= 'seance.id_enseignement=:enseignement, ';
		}

		// Booléen pour savoir s'il faut mettre à jour les champs de la table seance
		$seance_modifie = false;
		if(sizeof($values) > 0) {
			$seance_modifie = true;
			// On enlève les deux derniers caractères (espace et virgule)
			$query = substr($query, 0, -2);
			$query .= ' WHERE seance.id=:id_seance ';
			$values[':id_seance'] = $_id_seance;
		}

		/**** MODIFICATION DES GROUPES ****/
		// Récupération des anciens groupes de la séance modifiée
		$request_groupes = shSGBD::select(
			   'SELECT groupe.id '.
			   'FROM groupe '.
			   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
			   'WHERE participer.id_seance=:id_seance ',
			   array(':id_seance'=>$seance->id_seance)
		);

		// Création d'un tableau
		$groupes_seance = array();
		foreach($request_groupes AS $request_groupe)
			$groupes_seance[] = $request_groupe->id;

		// Création d'un tableau des nouveaux groupes
		$nouveaux_groupes = array();
		if( ($formulaire->isField('Groupe')) AND ($formulaire->getField('Groupe')->getValue() != '' ) )
			$nouveaux_groupes = $formulaire->getField('Groupe')->getValue();

		// Par défaut le booléen de modification est à false
		$groupe_modifie = false;

		// Différence entre les deux tableaux de groupes
		if( (array_diff($nouveaux_groupes, $groupes_seance) != null) OR (array_diff($groupes_seance, $nouveaux_groupes) != null) )
			$groupe_modifie = true;


		/**** MODIFICATION DES PROMOTIONS ****/
		// Récupération des anciennes promotions de la séance modifiée
		$request_promotions = shSGBD::select(
			   'SELECT promotion.id '.
			   'FROM promotion '.
			   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
			   'WHERE mutualiser.id_seance=:id_seance ',
			   array(':id_seance'=>$_id_seance)
		);

		// Création d'un tableau
		$promotions_seance = array();
		foreach($request_promotions AS $request_promotion)
			$promotions_seance[] = $request_promotion->id;

		$nouvelles_promotions = explode('-', $_promotions);

		// Par défaut le booléen de modification est à false
		$promotion_modifie = false;
		// Différence entre les deux tableaux de groupes
		if( (array_diff($nouvelles_promotions, $promotions_seance) != null) OR (array_diff($promotions_seance, $nouvelles_promotions) != null) )
			$promotion_modifie = true;

		// Si aucune modification n'a été faite on quitte la fonction
		if( (!$seance_modifie) AND (!$groupe_modifie) AND (!$promotion_modifie) )
			return;


		// Requête pour vérifier que les dates de fin de promotions ne sont pas inférieurs à la date de fin de récursivité
		$result = shSGBD::selectOne(
			   'SELECT promotion.date_fin '.
			   'FROM promotion '.
			   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($nouvelles_promotions) - 1).') '.
			   'ORDER BY promotion.date_fin ',
			   $nouvelles_promotions);

		$date_fin = $result->date_fin;

		if ( ($formulaire->getField('Date de fin de récursivité')->getValue() != '')
			   AND ($formulaire->getField('Date de fin de récursivité')->getValue() < $date_fin) )
			$date_fin =Date::fromFormulaire($formulaire->getField('Date de fin de récursivité')->getValue())->toSGBD();

		// Sélection de l'id parent
		$id_parent = ($seance->id_parent == null) ? $seance->id_seance : $seance->id_parent;


		// Sélection des séances filles
		$values_filles = array(':id_parent'=>$id_parent,
			   ':date_fin'=>$date_fin,
			   ':jour'=>$seance->jour,
			   ':id_seance'=>$seance->id_seance,
			   ':heure_debut'=>$seance->heure_debut,
			   ':heure_fin'=>$seance->heure_fin,
			   ':id_enseignement'=>$seance->id_enseignement);

		if($seance->id_enseignant == null)
			$query_enseignant = 'AND seance.id_enseignant IS NULL ';
		else {
			$values_filles[':id_enseignant'] = $seance->id_enseignant;
			$query_enseignant = 'AND seance.id_enseignant =:id_enseignant ';
		}

		if($seance->id_salle == null)
			$query_salle = 'AND seance.id_salle IS NULL ';
		else {
			$values_filles[':id_salle'] = $seance->id_salle;
			$query_salle = 'AND seance.id_salle =:id_salle ';
		}

		$query_filles = 'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'enseignement.id AS id_enseignement, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.jour<:date_fin '.
			   'AND seance.jour>=:jour '.
			   'AND seance.heure_debut=:heure_debut '.
			   'AND seance.heure_fin=:heure_fin '.
			   $query_enseignant.
			   'AND seance.id_enseignement=:id_enseignement '.
			   $query_salle.
			   'AND (seance.id_parent=:id_parent '.
			   'OR seance.id=:id_seance) ';

		$seances_filles = shSGBD::select($query_filles, $values_filles);

		// Récupération du jour de la semaine au format anglais 0 -> dimanche
		$jour_seance = Date::fromSGBD($seance->jour)->format('w');
		$jour_semaine = Date::fromFormulaire($formulaire->getField('Date')->getValue())->format('w');

		// Parcours des séances filles
		foreach($seances_filles AS $seance_fille) {
			$parametres_requete = array($seance_fille->id_seance);
			$parametres_requete[] = shSession::__instance()->getId();

			// Sélection des promotions en cours et qui suivent la séance
			$promotions = shSGBD::select(
				   'SELECT promotion.id '.
				   'FROM promotion '.
				   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
				   'INNER JOIN responsable ON responsable.id_promotion=promotion.id '.
				   'WHERE mutualiser.id_seance=? '.
				   'AND responsable.id_user=? ',
				   $parametres_requete
			);

			$promotions_fille = array();
			foreach($promotions AS $promotion) $promotions_fille[] = $promotion->id;

			$parametres_requete = explode('-', $_promotions);
			$parametres_requete[] = $seance_fille->id_seance;
			// Sélection des groupes des promotions en cours et qui suivent la séance
			$groupes = shSGBD::select(
				   'SELECT groupe.id '.
				   'FROM groupe '.
				   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
				   'WHERE groupe.id_promotion IN (? '.str_repeat(', ? ', sizeof($parametres_requete) - 2).') '.
				   'AND participer.id_seance=? ',
				   $parametres_requete
			);

			$groupes_fille = array();
			foreach($groupes AS $groupe) $groupes_fille[] = $groupe->id;

			if( (Date::fromSGBD($seance_fille->jour)->format('w') == $jour_seance) AND
				   (array_diff($groupes_seance, $groupes_fille) == null) AND (array_diff($groupes_fille, $groupes_seance) == null) AND
				   (array_diff($promotions_seance, $promotions_fille) == null) AND (array_diff($promotions_fille, $promotions_seance) == null)) {


				// Si les champs de la table séance doivent être modifiée
				if($seance_modifie) {
					$values[':id_seance'] = $seance_fille->id_seance;

					if($jour_modifie)
					// Actualise la date (sur le même jour de la semaine que la séance modifiée)
						$values[':jour'] = Date::fromSGBD($seance_fille->jour)->jourDeLaSemaine($jour_semaine, true)->toSGBD();

					// Mise à jour de la séance
					shSGBD::update($query, $values);

				}

				// Si les groupes sont modifiés on met à jour dans la table participer
				if($groupe_modifie) {

					// Suppression des groupes dans participer
					foreach($groupes AS $groupe)
						shSGBD::delete(
							   'DELETE FROM participer '.
							   'WHERE participer.id_groupe=:id_groupe '.
							   'AND participer.id_seance=:id_seance ',
							   array(':id_groupe'=>$groupe->id, ':id_seance'=>$seance_fille->id_seance)
						);

					// Insertion des nouveaux groupes dans participer
					foreach($nouveaux_groupes AS $nouveau_groupe) {
						shSGBD::insert(
							   'INSERT INTO participer '.
							   '(id_groupe, id_seance) '.
							   'VALUES (:id_groupe, :id_seance) ',
							   array(':id_groupe'=>$nouveau_groupe, ':id_seance'=>$seance_fille->id_seance)
						);
					}
				}

				// Si les promotions sont modifiées on met à jour dans la table mutualiser
				if($promotion_modifie) {

					// Suppression des promotions dans mutualiser
					foreach($promotions AS $promotion)
						shSGBD::delete(
							   'DELETE FROM mutualiser '.
							   'WHERE mutualiser.id_promotion=:id_promotion '.
							   'AND mutualiser.id_seance=:id_seance ',
							   array(':id_promotion'=>$promotion->id, ':id_seance'=>$seance_fille->id_seance)
						);


					// Insertion des nouvelles promotions dans mutualiser
					foreach($nouvelles_promotions AS $nouvelle_promotion) {
						shSGBD::insert(
							   'INSERT INTO mutualiser '.
							   '(id_promotion, id_seance) '.
							   'VALUES (:id_promotion, :id_seance) ',
							   array(':id_promotion'=>$nouvelle_promotion, ':id_seance'=>$seance_fille->id_seance)
						);
					}
				}
			}

		}

	}

	/**
	 * Execute la méthode d'édition d'une séance
	 * @param <integer> id seance
	 * @param <string> ids des promotions
	 * @param <integer> id de l'ue
	 * @param <integer> id du type d'enseignement
	 * @param <object> formulaire
	 */
	public static function executeEditReinitialise($_id_seance, $_promotions, $_id_ue, $_type_enseignement, $formulaire) {
		$date = Date::fromFormulaire($formulaire->getField('Date')->getValue())->toSGBD();



		// Requête pour sélectionner le cours et ses informations
		$seance = shSGBD::selectOne(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'enseignement.id AS id_enseignement, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.id=:id_seance ',
			   array(':id_seance'=>$_id_seance)
		);


		// Sélection de l'enseignement en fonction de l'ue et du type d'enseignement
		$enseignement = shSGBD::selectOne(
			   'SELECT enseignement.id '.
			   'FROM enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'WHERE enseignement.id_ue=:id_ue '.
			   'AND type_enseignement.id=:id_type_enseignement ',
			   array(':id_ue'=>$_id_ue,
			   ':id_type_enseignement'=>$_type_enseignement)
		);


		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_enseignant = ($formulaire->getField('Enseignant')->getValue() > 0) ?
			   $formulaire->getField('Enseignant')->getValue()
			   : null;

		// Vérifie que l'enseignant ne soit pas vide, sinon = null
		$id_salle = ($formulaire->getField('Salle')->getValue() > 0) ?
			   $formulaire->getField('Salle')->getValue()
			   : null;

		// Préparation des valeurs pour l'insert de la séance
		$values = array(
			   ':id_seance'=>$_id_seance,
			   ':id_enseignement'=>$enseignement->id,
			   ':id_salle'=>$id_salle,
			   ':id_enseignant'=>$id_enseignant,
			   ':jour'=>$date,
			   ':heure_debut'=>$formulaire->getField('Heure début')->getValue(),
			   ':heure_fin'=>$formulaire->getField('Heure fin')->getValue()
		);

		$promotions_selectionnees = explode('-', $_promotions);

		// Requête pour vérifier que les dates de fin de promotions ne sont pas inférieurs à la date de fin de récursivité
		$result = shSGBD::selectOne(
			   'SELECT promotion.date_fin '.
			   'FROM promotion '.
			   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($promotions_selectionnees) - 1).') '.
			   'ORDER BY promotion.date_fin ',
			   $promotions_selectionnees);

		$date_fin = $result->date_fin;

		if ( ($formulaire->getField('Date de fin de récursivité')->getValue() != '')
			   AND ($formulaire->getField('Date de fin de récursivité')->getValue() < $date_fin) )
			$date_fin =Date::fromFormulaire($formulaire->getField('Date de fin de récursivité')->getValue())->toSGBD();


		// Sélection de l'id parent
		$id_parent = ($seance->id_parent == null) ? $seance->id_seance : $seance->id_parent;

		// Sélection des séances filles
		$seances_filles = shSGBD::select(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'enseignement.id AS id_enseignement, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.jour<:date_fin '.
			   'AND seance.jour>=:jour '.
			   'AND (seance.id_parent=:id_parent '.
			   'OR seance.id=:id_seance) ',
			   array(':id_parent'=>$id_parent,
			   ':date_fin'=>$date_fin,
			   ':jour'=>$seance->jour,
			   ':id_seance'=>$seance->id_seance)
		);

		// Récupération du jour de la semaine au format anglais 0 -> dimanche
		$jour_semaine = Date::fromFormulaire($formulaire->getField('Date')->getValue())->format('w');


		// Parcours des séances filles
		foreach($seances_filles AS $seance_fille) {
			$values[':id_seance'] = $seance_fille->id_seance;

			// Actualise la date (sur le même jour de la semaine que la séance modifiée)
			$values[':jour'] = Date::fromSGBD($seance_fille->jour)->jourDeLaSemaine($jour_semaine, true)->toSGBD();

			// Mise à jour de la séance
			shSGBD::update(
				   'UPDATE seance '.
				   'SET seance.id_enseignement=:id_enseignement, '.
				   'seance.id_salle=:id_salle, '.
				   'seance.id_enseignant=:id_enseignant, '.
				   'seance.jour=:jour, '.
				   'seance.heure_debut=:heure_debut, '.
				   'seance.heure_fin=:heure_fin '.
				   'WHERE seance.id=:id_seance',
				   $values
			);

			// Récupération des anciennes promotions de la séance modifiée
			$request_promotions = shSGBD::select(
				   'SELECT promotion.id '.
				   'FROM promotion '.
				   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
				   'WHERE mutualiser.id_seance=:id_seance ',
				   array(':id_seance'=>$values[':id_seance'])
			);

			// Création d'un tableau
			$anciennes_promotions = array();
			foreach($request_promotions AS $request_promotion)
				$anciennes_promotions[] = $request_promotion->id;

			// Récupération des promotions
			$nouvelles_promotions = explode('-', $_promotions);

			// Intersection des nouvelles et anciennes promotions
			$intersection_promotions = array_intersect($anciennes_promotions, $nouvelles_promotions);

			// Nouvelles promotions sans l'es anciennes l'intersection
			$nouvelles_promotions = array_diff($nouvelles_promotions, $intersection_promotions);

			// Anciennes promotions sans l'intersection
			$anciennes_promotions = array_diff($anciennes_promotions, $intersection_promotions);

			// Insertion des nouvelles promotions
			foreach($nouvelles_promotions AS $nouvelle_promotion) {
				shSGBD::insert(
					   'INSERT INTO mutualiser '.
					   '(id_promotion, id_seance) '.
					   'VALUES (:id_promotion, :id_seance) ',
					   array(':id_promotion'=>$nouvelle_promotion, ':id_seance'=>$values[':id_seance'])
				);
			}

			// Suppression des anciennes promotions
			foreach($anciennes_promotions AS $ancienne_promotion) {
				shSGBD::insert(
					   'DELETE FROM mutualiser '.
					   'WHERE mutualiser.id_promotion=:id_promotion '.
					   'AND mutualiser.id_seance=:id_seance ',
					   array(':id_promotion'=>$ancienne_promotion, ':id_seance'=>$values[':id_seance'])
				);
			}

			// Récupération des anciens groupes de la séance modifiée
			$request_groupes = shSGBD::select(
				   'SELECT groupe.id '.
				   'FROM groupe '.
				   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
				   'WHERE participer.id_seance=:id_seance ',
				   array(':id_seance'=>$values[':id_seance'])
			);

			// Création d'un tableau
			$anciens_groupes = array();
			foreach($request_groupes AS $request_groupe)
				$anciens_groupes[] = $request_groupe->id;

			$nouveaux_groupes = array();
			// Création d'un tableau des nouvelles promotions
			if($formulaire->isField('Groupe'))
				$nouveaux_groupes = $formulaire->getField('Groupe')->getValue();

			// Intersection des nouvelles et anciennes promotions
			$intersection_groupes = array_intersect($anciens_groupes, $nouveaux_groupes);

			// Nouvelles promotions sans l'es anciennes l'intersection
			$nouveaux_groupes = array_diff($nouveaux_groupes, $intersection_groupes);

			// Anciennes promotions sans l'intersection
			$anciens_groupes = array_diff($anciens_groupes, $intersection_groupes);

			// Insertion des nouvelles promotions
			foreach($nouveaux_groupes AS $nouveau_groupe) {
				shSGBD::insert(
					   'INSERT INTO participer '.
					   '(id_groupe, id_seance) '.
					   'VALUES (:id_groupe, :id_seance) ',
					   array(':id_groupe'=>$nouveau_groupe, ':id_seance'=>$values[':id_seance'])
				);
			}

			// Suppression des anciennes promotions
			foreach($anciens_groupes AS $ancien_groupe) {
				shSGBD::insert(
					   'DELETE FROM participer '.
					   'WHERE participer.id_groupe=:id_groupe '.
					   'AND participer.id_seance=:id_seance ',
					   array(':id_groupe'=>$ancien_groupe, ':id_seance'=>$values[':id_seance'])
				);
			}
		}



	}


	/**
	 * Execute la méthode de chargement des promotions
	 * @param <date> date au format formulaire
	 */
	function executeLoadPromotions($_date) {

                $date = Date::fromURL($_date)->toSGBD();

		$result = shSGBD::select(
			   'SELECT promotion.id, specialite.intitule AS specialite, filiere.intitule AS filiere, promotion.date_debut, promotion.date_fin '.
			   'FROM promotion '.
			   'INNER JOIN specialite ON promotion.id_specialite=specialite.id '.
			   'INNER JOIN filiere ON specialite.id_filiere=filiere.id '.
			   'INNER JOIN responsable ON promotion.id=responsable.id_promotion '.
			   'WHERE responsable.id_user=:id_user '.
			   'AND promotion.date_debut<=:date '.
			   'AND promotion.date_fin>=:date '.
			   'ORDER BY filiere.intitule, specialite.intitule ',
			   array(':id_user'=>shSession::__instance()->getId(), ':date' => $date )
		);

                // Assignement de la variable
                $this->assign('promotions_xml', $result);

                return $result;
	}

	/**
	 * Execute la méthode de chargement des promotions
	 * @param <integer> id de la séance
	 */
	function executeLoadPromotionsFromSeance($_id_seance) {
		$result = shSGBD::select(
			   'SELECT promotion.id '.
			   'FROM promotion '.
			   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
			   'WHERE mutualiser.id_seance=:id_seance',
			   array(':id_seance'=>$_id_seance)
		);

		$this->assign('promotions_xml', $result);

		return $result;
	}

	/**
	 * Execute la méthode de chargement des promotions
	 * @param <string> ids promotion
	 */
	function executeLoadPromotionsFromParametre($_promotions) {
		$parametres_requete = explode('-', $_promotions);
		$parametres_requete[] = shSession::__instance()->getId();

		$promotions = shSGBD::select(
			   'SELECT DISTINCT promotion.id, specialite.intitule AS specialite, filiere.intitule AS filiere, promotion.date_debut, promotion.date_fin '.
			   'FROM promotion '.
			   'INNER JOIN specialite ON promotion.id_specialite=specialite.id '.
			   'INNER JOIN filiere ON specialite.id_filiere=filiere.id '.
			   'INNER JOIN responsable ON promotion.id=responsable.id_promotion '.
			   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($parametres_requete) - 2).') '.
			   'AND responsable.id_user=? '.
			   'ORDER BY filiere.intitule, specialite.intitule ',
			   $parametres_requete
		);

		return $promotions;
	}


	/**
	 * Execute la méthode de chargement des ues en fonction de promotion(s)
	 * @param <string> ids promotions
	 */
	function executeLoadUesFromPromotions($_promotions) {

		$tab_promotions = explode('-', $_promotions);

		// Sélection des ues en fonction des promotions
		$query = 'SELECT DISTINCT ue.id, ue.intitule ';
		for($i=0;$i<sizeof($tab_promotions);$i++) {
			$query .= 'FROM ue '.
				   'INNER JOIN assister ON ue.id=assister.id_ue '.
				   'INNER JOIN enseignement ON enseignement.id_ue=ue.id '.
				   'WHERE assister.id_promotion = ? ';
			if($i < sizeof($tab_promotions) - 1) {
				$query .= ' AND ue.id IN ( SELECT ue.id ';

			}
		}

		$query = $query.str_repeat(')', sizeof($tab_promotions) - 1);
		$result = shSGBD::select($query, $tab_promotions);

		$this->assign('ues_xml', $result);
		return $result;
	}



	/**
	 * Execute la méthode de chargement des types d'enseignement d'une ue
	 * @param <array> id d'une ue
	 */
	function executeLoadTypeEnseignementFromUe($_ue) {
		$result = shSGBD::select(
			   'SELECT type_enseignement.id, type_enseignement.intitule '.
			   'FROM type_enseignement '.
			   'INNER JOIN enseignement ON enseignement.id_type_enseignement=type_enseignement.id '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'WHERE ue.id=:id_ue',
			   array(':id_ue'=>$_ue)
		);

		$this->assign('type_enseignement_xml', $result);
		return $result;

	}

	/**
	 * Execute la méthode de chargement des groupes en fonction de promotions et d'un type d'enseignement
	 * @param <string> ids de promotions (id1-id2-...)
	 * @param <integer> id d'une ue
	 * @param <integer> id d'un type d'enseignement
	 */
	function executeLoadGroupes($_promotions, $_ue, $_type_enseignement) {
		// Tableau des paramètres de la requête des groupes
		$param_requete = explode('-', $_promotions); // Tableau des ids des promotions
		$param_requete[] = $_type_enseignement;
		$param_requete[] = $_ue;

		$result = shSGBD::select(
			   'SELECT groupe.id AS id_groupe, groupe.intitule AS intitule_groupe, '.
			   'filiere.intitule AS intitule_filiere, '.
			   'specialite.intitule AS intitule_specialite '.
			   'FROM groupe '.
			   'INNER JOIN enseignement ON enseignement.id=groupe.id_enseignement '.
			   'INNER JOIN promotion ON promotion.id=groupe.id_promotion '.
			   'INNER JOIN specialite ON specialite.id=promotion.id_specialite '.
			   'INNER JOIN filiere ON filiere.id=specialite.id_filiere '.
			   'WHERE promotion.id IN (?'.str_repeat(',? ', sizeof($param_requete) - 3).') '.
			   'AND enseignement.id_type_enseignement=? '.
			   'AND enseignement.id_ue=?',
			   $param_requete
		);

		$this->assign('groupes_xml', $result);
		return $result;
	}

	/**
	 * Execute la méthode de chargement des enseignants en fonction d'une ue
	 * @param <array> id d'une ue
	 */
	function executeLoadEnseignantFromUe($_ue) {

		$result = shSGBD::select(
			   'SELECT DISTINCT enseignant.id, enseignant.nom, enseignant.prenom '.
			   'FROM enseignant '.
			   'INNER JOIN enseigner ON enseignant.id=enseigner.id_enseignant '.
			   'WHERE enseigner.id_ue=:id_ue',
			   array(':id_ue'=>$_ue)
		);

		$this->assign('enseignant_xml', $result);

		return $result;
	}


	/**
	 * Execute la méthode de chargement des salles occupées pendant un créneau horaire
	 * @param <string> date au format url
	 * @param <string> heure de début
	 * @param <string> heure de fin
	 * @param <date> date au format url
	 */
	function executeLoadSallesOccupeesRecursivite($_date, $_heure_debut, $_heure_fin, $_recursivite) {
		$h_deb = implode(':', explode('-', $_heure_debut));
		$h_fin = implode(':', explode('-', $_heure_fin));

		// Numéro du jour ( + 1 pour être au format mysql)
		$numero_jour = Date::fromUrl($_date)->format('w') + 1;

		$result = shSGBD::select(
			   'SELECT DISTINCT salle.id '.
			   'FROM salle '.
			   'INNER JOIN seance ON seance.id_salle=salle.id '.
			   'WHERE seance.jour>:jour '.
			   'AND seance.jour < :date_recursivite '.
			   'AND DAYOFWEEK(seance.jour)=:numero_jour '.
			   'AND ( (seance.heure_debut <= :heure_debut '.
			   'AND seance.heure_fin > :heure_debut) '.
			   'OR (seance.heure_debut < :heure_fin '.
			   'AND seance.heure_fin >= :heure_fin) '.
			   'OR (seance.heure_debut >= :heure_debut '.
			   'AND seance.heure_fin <= :heure_fin) )',
			   array(':jour'=>Date::fromURL($_date)->toSGBD(),
			   ':date_recursivite'=>Date::fromURL($_recursivite)->toSGBD(),
			   ':numero_jour'=>$numero_jour,
			   ':heure_fin'=>$h_fin,
			   ':heure_debut'=>$h_deb)
		);

		$this->assign('salles_xml', $result);

		return $result;
	}

	/**
	 * Execute la méthode de chargement des salles occupées pour les séances filles d'une séance
	 * @param <integer> id de la séance
	 * @param <integer> recursivite à appliquer
	 * @param <string> date de fin de récursivité au format url
	 * @param <string> date de la séance au format url
	 * @param <string> heure au format url
	 * @param <string> heure au format url
	 */
	function executeLoadSallesOccupeesSeancesFilles($_seance, $_recursivite, $_date_fin = null, $_date = null, $_heure_debut = null, $_heure_fin = null) {
		// Initialisation du tableaux résultats
		$tableau_salles = array();

		// Sélection de la séance
		$seance = shSGBD::selectOne(
			   'SELECT seance.id, seance.id_parent, seance.jour, seance.heure_debut, seance.heure_fin, '.
			   'seance.id_enseignant, seance.id_enseignement, seance.id_salle '.
			   'FROM seance '.
			   'WHERE seance.id=:id_seance ',
			   array(':id_seance'=>$_seance)
		);

		// Récupération de l'id parent
		$id_parent = ($seance->id_parent == null) ? $seance->id : $seance->id_parent;

		// Préparation des valeurs des requêtes
		$values = array();
		if($_heure_debut != null)
			$heure_debut = implode(':', explode('-', $_heure_debut));
		else
			$heure_debut = $seance->heure_debut;

		if($_heure_fin != null)
			$heure_fin = implode(':', explode('-', $_heure_fin));
		else
			$heure_fin = $seance->heure_fin;

		if($_date != null)
			$date_seance = Date::fromURL($_date)->toSGBD();
		else
			$date_seance = $seance->jour;

		// Récupération de la date de fin
		if($_date_fin == null) {
			$derniere_seance = shSGBD::selectOne(
				   'SELECT seance.jour '.
				   'FROM seance '.
				   'WHERE (seance.id_parent=:id_parent '.
				   'OR seance.id=:id_parent) '.
				   'ORDER BY seance.jour DESC',
				   array(':id_parent'=>$id_parent)
			);

			$date_fin = $derniere_seance->jour;
		}
		else
			$date_fin = $_date_fin;

		// Test sur la récursivité
		switch($_recursivite) {
			case 2:
			// Sélection de toutes les séances filles de la séance
				$seances_filles = shSGBD::select(
					   'SELECT seance.id, seance.jour, seance.heure_debut, seance.heure_fin '.
					   'FROM seance '.
					   'WHERE seance.id_parent=:id_parent '.
					   'AND seance.id!=:id_seance '.
					   'AND seance.jour <= :jour ',
					   array(':id_parent'=>$id_parent, ':id_seance'=>$seance->id, ':jour'=>$date_fin)
				);

				// Récupération du jour de la semaine au format anglais 0 -> dimanche
				$jour_semaine = Date::fromSGBD($date_seance)->format('w');

				// Parcours des résultat
				foreach($seances_filles AS $seance_fille) {
					// Récupération de la date
					$date = Date::fromSGBD($seance_fille->jour)->jourDeLaSemaine($jour_semaine, true)->toURL();

					if($_heure_debut == null)
						$heure_debut = $seance_fille->heure_debut;

					if($_heure_fin == null)
						$heure_fin = $seance_fille->heure_fin;

					// Chargement des salles
					$salles = $this->executeLoadSallesOccupees($date, $heure_debut, $heure_fin, $seance_fille->id);

					foreach($salles AS $salle)
						$tableau_salles[] = $salle->id;

				}

				break;
			case 3: // Séances identiques uniquement
			// Sélection des séances filles
				$values_filles = array(':id_parent'=>$id_parent,
					   ':date_fin'=>$date_fin,
					   ':jour'=>$seance->jour,
					   ':id_seance'=>$seance->id,
					   ':heure_debut'=>$seance->heure_debut,
					   ':heure_fin'=>$seance->heure_fin,
					   ':id_enseignement'=>$seance->id_enseignement);

				if($seance->id_enseignant == null)
					$query_enseignant = 'AND seance.id_enseignant IS NULL ';
				else {
					$values_filles[':id_enseignant'] = $seance->id_enseignant;
					$query_enseignant = 'AND seance.id_enseignant =:id_enseignant ';
				}

				if($seance->id_salle == null)
					$query_salle = 'AND seance.id_salle IS NULL ';
				else {
					$values_filles[':id_salle'] = $seance->id_salle;
					$query_salle = 'AND seance.id_salle =:id_salle ';
				}

				$query_filles = 'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
					   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
					   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
					   'enseignement.id AS id_enseignement, '.
					   'type_enseignement.id AS id_type_enseignement '.
					   'FROM seance '.
					   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
					   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
					   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
					   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
					   'WHERE seance.jour<:date_fin '.
					   'AND seance.jour>=:jour '.
					   'AND seance.heure_debut=:heure_debut '.
					   'AND seance.heure_fin=:heure_fin '.
					   $query_enseignant.
					   'AND seance.id_enseignement=:id_enseignement '.
					   $query_salle.
					   'AND seance.id_parent=:id_parent '.
					   'AND seance.id!=:id_seance ';

				$seances_filles = shSGBD::select($query_filles, $values_filles);

				// Récupération des anciens groupes de la séance modifiée
				$request_groupes = shSGBD::select(
					   'SELECT groupe.id '.
					   'FROM groupe '.
					   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
					   'WHERE participer.id_seance=:id_seance ',
					   array(':id_seance'=>$seance->id)
				);

				// Création d'un tableau
				$groupes_seance = array();
				foreach($request_groupes AS $request_groupe)
					$groupes_seance[] = $request_groupe->id;

				// Récupération des anciennes promotions de la séance modifiée
				$request_promotions = shSGBD::select(
					   'SELECT promotion.id '.
					   'FROM promotion '.
					   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
					   'WHERE mutualiser.id_seance=:id_seance ',
					   array(':id_seance'=>$seance->id)
				);

				// Création d'un tableau
				$promotions_seance = array();
				foreach($request_promotions AS $request_promotion)
					$promotions_seance[] = $request_promotion->id;

				// Récupération du numéro de jour de la séance
				$jour_semaine = Date::fromSGBD($seance->jour)->format('w');

				// Parcours des séances filles
				foreach($seances_filles AS $seance_fille) {
					// Groupes de la séance filles
					$request_groupes = shSGBD::select(
						   'SELECT groupe.id '.
						   'FROM groupe '.
						   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
						   'WHERE participer.id_seance=:id_seance ',
						   array(':id_seance'=>$seance_fille->id_seance)
					);

					// Création d'un tableau
					$groupes_fille = array();
					foreach($request_groupes AS $request_groupe)
						$groupes_fille[] = $request_groupe->id;

					// Promotions de la séance fille
					$request_promotions = shSGBD::select(
						   'SELECT promotion.id '.
						   'FROM promotion '.
						   'INNER JOIN mutualiser ON mutualiser.id_promotion=promotion.id '.
						   'WHERE mutualiser.id_seance=:id_seance ',
						   array(':id_seance'=>$seance_fille->id_seance)
					);

					// Création d'un tableau
					$promotions_fille = array();
					foreach($request_promotions AS $request_promotion)
						$promotions_fille[] = $request_promotion->id;

					// Vérification de la correspondance de date, des groupes et des promotions
					if( ($jour_semaine == Date::fromSGBD($seance_fille->jour)->format('w'))
						   AND (array_diff($groupes_seance, $groupes_fille) == null)
						   AND (array_diff($groupes_fille, $groupes_seance) == null)
						   AND (array_diff($promotions_seance, $promotions_fille) == null)
						   AND (array_diff($promotions_fille, $promotions_seance) == null) ) {

						// Récupération de la date
						$date = Date::fromSGBD($seance_fille->jour)->jourDeLaSemaine($jour_semaine, true)->toURL();

						if($_heure_debut == null)
							$heure_debut = $seance_fille->heure_debut;

						if($_heure_fin == null)
							$heure_fin = $seance_fille->heure_fin;

						// Chargement des salles
						$salles = $this->executeLoadSallesOccupees($date, $heure_debut, $heure_fin, $seance_fille->id_seance);

						foreach($salles AS $salle)
							$tableau_salles[] = $salle->id;
					}
				}


				break;
			case 4:
			// Sélection de toutes les séances filles de la séance
				$seances_filles = shSGBD::select(
					   'SELECT seance.id, seance.jour '.
					   'FROM seance '.
					   'WHERE seance.id_parent=:id_parent '.
					   'AND seance.id!=:id_seance '.
					   'AND seance.jour <= :jour ',
					   array(':id_parent'=>$id_parent, ':id_seance'=>$seance->id, ':jour'=>$date_fin)
				);


				// Récupération du jour de la semaine au format anglais 0 -> dimanche
				$jour_semaine = Date::fromSGBD($date_seance)->format('w');

				foreach($seances_filles AS $seance_fille) {
					// Récupération de la date
					$date = Date::fromSGBD($seance_fille->jour)->jourDeLaSemaine($jour_semaine, true)->toURL();

					// Chargement des salles
					$salles = $this->executeLoadSallesOccupees($date, $heure_debut, $heure_fin, $seance_fille->id);

					foreach($salles AS $salle)
						$tableau_salles[] = $salle->id;
				}

				break;
			default:
				break;

		}

		// Supprime les doublons
		$tableau_salles = array_unique($tableau_salles);

		$this->assign('salles_xml', $tableau_salles);

		return $tableau_salles;
	}

	/**
	 * Execute la méthode de chargement des salles occupées pendant un créneau horaire
	 * @param <string> date venant d'un formulaire
	 * @param <string> heure de début
	 * @param <string> heure de fin
	 */
	function executeLoadSallesOccupees($_date, $_heure_debut, $_heure_fin, $_id_seance = null) {
		$h_deb = implode(':', explode('-', $_heure_debut));
		$h_fin = implode(':', explode('-', $_heure_fin));

		// Préparation des conditions et des valeurs
		$condition = '';
		$values = array(':jour'=>Date::fromURL($_date)->toSGBD(),
			   ':heure_fin'=>$h_fin,
			   ':heure_debut'=>$h_deb);
		if($_id_seance != null) {
			$condition = 'AND seance.id!=:id_seance ';
			$values[':id_seance'] = $_id_seance;
		}

		$result = shSGBD::select(
			   'SELECT DISTINCT salle.id '.
			   'FROM salle '.
			   'INNER JOIN seance ON seance.id_salle=salle.id '.
			   'WHERE seance.jour=:jour '.
			   $condition.
			   'AND ( (seance.heure_debut <= :heure_debut '.
			   'AND seance.heure_fin > :heure_debut) '.
			   'OR (seance.heure_debut < :heure_fin '.
			   'AND seance.heure_fin >= :heure_fin) '.
			   'OR (seance.heure_debut >= :heure_debut '.
			   'AND seance.heure_fin <= :heure_fin) )',
			   $values
		);


		$this->assign('salles_xml', $result);

		return $result;
	}

	/**
	 * Execute la méthode de chargement des salles
	 */
	function executeLoadSalles() {

		$result = shSGBD::select(
		   'SELECT salle.id, salle.intitule '.
		   'FROM salle '.
		   'INNER JOIN batiment ON salle.id_batiment=batiment.id '.
		   'ORDER BY batiment.intitule, salle.intitule',
		   array());

		$this->assign('salle_xml', $result);

		return $result;
	}

	/**
	 * Execute la méthode de chargement des informations d'une séance
	 * @param <integer> id seance
	 */
	function executeLoadSeance($_seance) {

		$result = shSGBD::selectOne(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
			   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
			   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
			   'type_enseignement.id AS id_type_enseignement '.
			   'FROM seance '.
			   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
			   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
			   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
			   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
			   'WHERE seance.id=:id_seance ',
			   array(':id_seance'=>$_seance)
		);

		$groupe = shSGBD::selectOne('SELECT groupe.id '.
			   'FROM groupe '.
			   'INNER JOIN participer ON participer.id_groupe=groupe.id '.
			   'WHERE participer.id_seance=:id_seance ',
			   array(':id_seance'=>$_seance));
		$result->id_groupe = $groupe->id;

		$this->assign('seance_xml', $result);

		return $result;
	}

	/**
	 * Execute la méthode de comptage des séances filles/soeur ultérieurs
	 * @param <integer> id seance
	 */
	function executeCountSeancesFilles($_seance) {
		$result = shSGBD::selectOne(
			   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent '.
			   'FROM seance '.
			   'WHERE seance.id=:id_seance ',
			   array(':id_seance'=>$_seance)
		);

		// Sélection des cours filles
		$id_parent = ($result->id_parent != null) ? $result->id_parent : $result->id_seance;

		// Calcul du nombre de séances filles
		$count_seances_filles = shSGBD::count(
			   'SELECT count(seance.id) '.
			   'FROM seance '.
			   'WHERE seance.id_parent=:id_parent ',
			   array(':id_parent'=>$id_parent)
		);

		$this->assign('count', $count_seances_filles);

		return $count_seances_filles;
	}

	/**
	 * Execute la méthode d'édition des plages horaires
	 * @param <integer> id seance
	 * @param <string> heure de début
	 * @param <string> heure de fin
	 * @param <date> date au format url
	 * @param <boolean> indique s'il y a recursivite
	 * @param <boolean> indique s'il y a ecrasement
	 */
	function executeEditHorairesSeance($_seance, $_heure_debut, $_heure_fin, $_date, $_recursivite = null, $_ecrasement = null) {
		$h_deb = implode(':', explode('-', $_heure_debut));
		$h_fin = implode(':', explode('-', $_heure_fin));

		$values = array(':jour'=>Date::fromUrl($_date)->toSGBD(),
			   ':heure_debut'=>$h_deb,
			   ':heure_fin'=>$h_fin,
			   ':id_seance'=>$_seance);


		if($_recursivite == null) {
			// Mise à jour de la séance
			shSGBD::update(
				   'UPDATE seance '.
				   'SET seance.jour=:jour, '.
				   'seance.heure_debut=:heure_debut, '.
				   'seance.heure_fin=:heure_fin '.
				   'WHERE seance.id=:id_seance',
				   $values
			);

		}
		else {


			$seance_modifiee = shSGBD::selectOne(
				   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour '.
				   'FROM seance '.
				   'WHERE seance.id=:id_seance ',
				   array(':id_seance'=>$_seance)
			);

			$id_parent = ($seance_modifiee->id_parent == null) ? $seance_modifiee->id_seance : $seance_modifiee->id_parent;
			$jour_semaine = Date::fromUrl($_date)->format('w');

			// Test si l'écrasement est demandé
			if($_ecrasement == null) { // Pas d'écrasement
				// Sélection des séances filles qui correspondent exactement à la séance parente
				$request_seances = shSGBD::select(
					   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
					   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
					   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
					   'enseignement.id AS id_enseignement, '.
					   'type_enseignement.id AS id_type_enseignement '.
					   'FROM seance '.
					   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
					   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
					   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
					   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
					   'WHERE seance.jour>=:jour '.
					   'AND seance.heure_debut=:heure_debut '.
					   'AND seance.heure_fin=:heure_fin '.
					   'AND (seance.id_parent=:id_parent '.
					   'OR seance.id=:id_seance) ',
					   array(':id_parent'=>$id_parent,
					   ':jour'=>$seance_modifiee->jour,
					   ':id_seance'=>$seance_modifiee->id_seance,
					   ':heure_debut'=>$seance_modifiee->heure_debut,
					   ':heure_fin'=>$seance_modifiee->heure_fin)
				);

				// Retourne la différence absolue entre la date de la séance et la date saisie dans le formulaire
				$difference_date = Date::fromSGBD($seance_modifiee->jour)->diff(Date::fromURL($_date));

				foreach($request_seances AS $seance) {

					$values[':id_seance'] = $seance->id_seance;
					// Actualise la date (sur le même jour de la semaine que la séance modifiée)
					$jour_seance = Date::fromSGBD($seance->jour)->jourDeLaSemaine($jour_semaine, true);
					$values[':jour'] = $jour_seance->toSGBD();

					$date_calculee = Date::fromSGBD($seance->jour)->add($difference_date);
					if(Date::fromSGBD($date)->format('N') == $date_calculee->format('N'))
						$values[':jour'] = $date_calculee->toSGBD();
					else
						$values[':jour'] = $request_seance->jour;

					shSGBD::update(
						   'UPDATE seance '.
						   'SET seance.jour=:jour, '.
						   'seance.heure_debut=:heure_debut, '.
						   'seance.heure_fin=:heure_fin '.
						   'WHERE seance.id=:id_seance',
						   $values);
				}

			} // Fin test ecrasement
			else { // Ecrasement demandé

				// Sélection des séances filles
				$request_seances = shSGBD::select(
					   'SELECT seance.id AS id_seance, seance.id_parent AS id_parent, seance.jour, seance.id_salle, seance.heure_debut, seance.heure_fin, '.
					   'ue.id AS id_ue, ue.intitule AS intitule_ue, '.
					   'enseignant.id AS id_enseignant, enseignant.nom AS nom_enseignant, enseignant.prenom AS prenom_enseignant, '.
					   'enseignement.id AS id_enseignement, '.
					   'type_enseignement.id AS id_type_enseignement '.
					   'FROM seance '.
					   'INNER JOIN enseignement ON enseignement.id=seance.id_enseignement '.
					   'INNER JOIN type_enseignement ON type_enseignement.id=enseignement.id_type_enseignement '.
					   'INNER JOIN ue ON ue.id=enseignement.id_ue '.
					   'LEFT JOIN enseignant ON enseignant.id=seance.id_enseignant '.
					   'WHERE seance.jour>=:jour '.
					   'AND (seance.id_parent=:id_parent '.
					   'OR seance.id=:id_seance) ',
					   array(':id_parent'=>$id_parent,
					   ':jour'=>$seance_modifiee->jour,
					   ':id_seance'=>$seance_modifiee->id_seance)
				);

				foreach($request_seances AS $seance) {

					$values[':id_seance'] = $seance->id_seance;
					// Actualise la date (sur le même jour de la semaine que la séance modifiée)
					$jour_seance = Date::fromSGBD($seance->jour)->jourDeLaSemaine($jour_semaine, true);
					$values[':jour'] = $jour_seance->toSGBD();


					shSGBD::update(
						   'UPDATE seance '.
						   'SET seance.jour=:jour, '.
						   'seance.heure_debut=:heure_debut, '.
						   'seance.heure_fin=:heure_fin '.
						   'WHERE seance.id=:id_seance',
						   $values);
				}
			}


		}
	}

}

?>